11 Ruby Tricks You Haven’t Seen Before
Bài đăng này đã không được cập nhật trong 7 năm
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