Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

11 Kỹ Thuật Ruby Nâng Cao Bạn Có Thể Đã Bỏ Lỡ

Tìm một vài thủ thuật Ruby cool?

Bạn tìm thấy rồi!

Bài này chia sẻ một số thủ thuật yêu thích của mình.

Mục Lục

  • 1 Deep copy
  • 2 Các cách gọi lambda khác nhau
  • 3 Tạo mảng điền sẵn
  • 4 True, false và nil là đối tượng
  • 5 Lambdas nghiêm ngặt về đối số, Procs không quan tâm
  • 6 Thực thi code trực tiếp không cần irb hay file
  • 7 Mini-irb riêng trong một lệnh
  • 8 Unfreeze đối tượng (nguy hiểm!)
  • 9 Đối tượng với danh tính đặc biệt
  • 10 Tránh đầu ra lớn trong irb hoặc pry
  • 11 Dùng caller method lấy call stack hiện tại
  • 12 Bonus! Chuyển bất kỳ giá trị thành boolean
  • 13 Bonus! Dùng Từ Khóa Làm Tên Biến
  • 14 Tóm Tắt
    • 14.1 Related

Deep copy

Khi copy đối tượng chứa đối tượng khác, như Array, chỉ tham chiếu đến các đối tượng đó được sao chép.

Thấy điều đó ở đây:

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

Dùng lớp Marshal, thường dùng cho serialization, tạo 'deep copy' đối tượng.

def deep_copy(obj)
  Marshal.load(Marshal.dump(obj))
end

Kết quả:

deep_copy(food).map(&:object_id) # [42975648, 42975624, 42975612]

Các Cách Gọi Lambda Khác Nhau

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

Nếu có thể, nên dùng cái đầu (call), vì đó là cách hầu hết mọi người biết.

Tạo Mảng Điền Sẵn

Lớp Array nhận đối số + block, cho phép tạo mảng n phần tử. Mặc định phần tử là nil, nhưng nếu có block, giá trị từ block.

Ví dụ:

Array.new(10) { rand 300 }

Tạo mảng 10 số ngẫu nhiên từ 0 đến 299.

True, False Và Nil Là Đối Tượng

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

Chỉ có một bản sao của các đối tượng này, không thể tạo thêm ngay cả khi muốn.

Đây là pattern Singleton đang hoạt động.

Lambdas Nghiêm Ngặt Về Đối Số, Procs Không Quan Tâm

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

Thực Thi Code Trực Tiếp Không Cần Irb Hay File

Lệnh ruby có tùy chọn thú vị.

Ví dụ, cờ -e cho truyền đoạn code thực thi.

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

Tìm thêm với cờ -h.

Mini-irb Riêng Trong Một Lệnh

Bao giờ muốn biết irb hoạt động như thế nào? Đây là phiên bản siêu đơn giản.

Nhớ REPL nghĩa là: Read-Eval-Print Loop.

ruby -n -e 'p eval($_)'

Không có prompt, nhưng hãy gõ code Ruby.

"A" * 5
"AAAAA"

Hoạt động vì cờ -n làm:

-n assume 'while gets(); ... end' loop around your script

Và $_ là biến toàn cục. Chứa:

The last input line of string by gets or readline.

Unfreeze Đối Tượng (Nguy Hiểm!)

Không có phương thức Ruby unfreeze đối tượng, nhưng dùng lớp Fiddle có thể chạm vào nội tại Ruby để làm được.

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

Đừng thử ở nhà!

Đối Tượng Với Danh Tính Đặc Biệt

Ruby đối tượng có identifier hoặc 'id' số truy cập bằng phương thức object_id. Một số đối tượng có id cố định: Fixnums, true, false & nil.

false.object_id # 0
true.object_id  # 2
nil.object_id   # 4
1.object_id     # 3
2.object_id     # 5

Fixnum ids dùng công thức: (number * 2) + 1.

Bonus: Fixnum tối đa là 1073741823, sau đó là đối tượng Bignum.

Tránh Đầu Ra Lớn Trong Irb Hoặc Pry

Nếu làm việc trong irb muốn tránh lấp đầy màn hình nội dung mảng/chuỗi lớn, chỉ cần thêm ; cuối code.

Ví dụ:

require 'rest-client'
RestClient.get('www.rubyguides.com');

Thử lại không có ; xem khác biệt 🙂

Dùng Caller Method Lấy Call Stack Hiện Tại

Ví dụ code:

def foo
  bar
end
def bar
  puts caller
end
foo

Đầu ra:

-:3:in 'foo'
-:10:in '<main>'

Nếu cần tên phương thức hiện tại dùng __method__ hoặc __callee__.

Bonus! Chuyển Bất Kỳ Giá Trị Thành Boolean

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

Bonus! Dùng Từ Khóa Làm Tên Biến

def foo (if: nil)
  binding.local_variable_get(:if)
end
foo(if: true)

Tóm Tắt

Hy vọng bạn thích các thủ thuật Ruby này!

Chia sẻ với bạn bè để họ cũng tận hưởng & đăng ký blog form dưới để không bỏ lỡ bài tiếp theo. 🙂