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 ...
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/