+1

11 Ruby Tricks You Haven’t Seen Before

Ruby là một ngôn ngữ tuyệt vời với nhiều thứ hay ho, cá nhân tôi sau một thời gian làm Ruby on rails và bây giờ quay lại tìm hiểu kỹ ngôn ngữ này. Hôm nay tôi sẽ chia sẻ với các bạn một số trick trong ruby.

1. Deep copy

Khi bạn copy một object, giống như Array, chỉ có địa chỉ tham chiếu của object được copy.

food = %w( bread milk orange )
food.map(&:object_id)       # [35401044, 35401020, 35400996]
food.clone.map(&:object_id) # [35401044, 35401020, 35400996]

Chúng ta có thể sử dụng Marshal class để tạo deep_copy object.

def deep_copy(obj)
  Marshal.load(Marshal.dump(obj))
end
=> result 
deep_copy(food).map(&:object_id) # [42975648, 42975624, 42975612]

2. Different ways to call a lambda

my_lambda = -> { puts 'Hello' }
 
my_lambda.call
my_lambda[]
my_lambda.()
my_lambda.===

Nếu có thể, bạn nên sử dụng call vì nó được nhiều người biết đến và sử dụng.

3. Creating a pre-filled array

Array.new(10) { rand 300 }

Đoạn code trên sẽ tạo ra 1 mảng với 10 phần tử random trong khoảng 0 đến 299

4. True, false and nil are objects

true.class  # TrueClass
false.class # FalseClass
nil.class   # NilClass

5. Lambdas are strict about arguments, but Procs don’t care

my_lambda = ->(a, b)  { a + b }
my_proc   = Proc.new  { |a, b| a + b }
 
my_lambda.call(2)
#ArgumentError: wrong number of arguments (1 for 2)
 
my_proc.call(2)
#TypeError: nil can't be coerced into Fixnum

6. Execute code directly without irb or files

Lệnh ruby có một số options cho chúng ta sử dụng, ví dụ như -e để thực thi đoạn code.

ruby -e '5.times { puts "Fun with Ruby" }'

Bạn có thể tìm hiểu thêm các lệnh khác với options -h

7. Your own mini-irb in one command

Đã bao giờ bạn thắc mắc irb hoạt động như thế nào? Với command này, bạn sẽ có bản siêu đơn giản của irb ruby -n -e 'p eval($_)' Sau đó không có nhắc lệnh, nhưng bạn thử 1 đoạn code bất kỳ.

"A" * 5
"AAAAA"

Có thể làm được điều trên là do.

-n    assume 'while gets(); ... end' loop around your script
$     The last input line of string by gets or readline.

8. Unfreeze an object (danger!)

Không có method nào của Ruby có thể unfreeze object. Nhưng chúng ta có thể sử dụng Fiddle class để làm được điều đó.

require 'fiddle'
 
str = 'water'.freeze
str.frozen? # true
 
memory_address = str.object_id * 2
 
Fiddle::Pointer.new(memory_address)[1] &= ~8
 
str.frozen? # false

9. Objects with special identity

Ruby object có định danh hoặc id number, bạn có thể truy cập bằng cách sử dụng object_id method. Một số object fixed id: Fixnum, true, false & nil.

false.object_id # 0
true.object_id  # 20
nil.object_id   # 8
 
1.object_id # 3
2.object_id # 5

Fixnum ids use this formula: (number * 2) + 1. The maximum Fixnum is 1073741823, after that you get a Bignum object.

10. Avoid big output in irb or pry

Nếu bạn làm việc trong irb và muốn tránh việc tràn nội dung trên màn hình khi query, bạn có thể sử dụng ; vào cuối đoạn code để tránh được điều này.

User.all;

11. Convert any value into a boolean

!!(1)   # true
!!(nil) # false

Hy vọng những trick trên sẽ giúp bạn thấy thú vị hơn trong lập trình với ruby.

Nguồn dịch: https://www.blackbytes.info/2016/01/ruby-tricks/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí