Computer >> Máy Tính >  >> Lập trình >> Ruby

11 thủ thuật Ruby mà bạn chưa từng thấy

Bạn đang tìm một số thủ thuật Ruby thú vị?

Bạn đã tìm thấy chúng!

Trong bài viết này, tôi muốn chia sẻ với bạn một số mục yêu thích của tôi.

Nội dung

  • 1 Bản sao sâu
  • 2 Cách khác nhau để gọi lambda
  • 3 Tạo một mảng được điền trước
  • 4 True, false và nil là các đối tượng
  • 5 Lambdas nghiêm khắc về lập luận, nhưng Procs không quan tâm
  • 6 Thực thi mã trực tiếp mà không có irb hoặc tệp
  • 7 Mini-irb của riêng bạn trong một lệnh
  • 8 Giải phóng một vật thể (nguy hiểm!)
  • 9 Đối tượng có danh tính đặc biệt
  • 10 Tránh đầu ra lớn trong irb hoặc pry
  • 11 Sử dụng phương thức người gọi để nhận ngăn xếp cuộc gọi hiện tại
  • 12 Tiền thưởng! Chuyển đổi bất kỳ giá trị nào thành boolean
  • 13 Phần thưởng! Sử dụng từ khóa làm tên biến
  • 14 Tóm tắt
    • 14.1 Có liên quan

Bản sao sâu

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

Bạn có thể thấy điều đó đang hoạt động tại đây:

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

Sử dụng Marshal , thường được sử dụng để tuần tự hóa, bạn có thể tạo 'bản sao sâu' của một đố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 khác nhau để gọi lambda

my_lambda = -> { puts 'Hello' }

my_lambda.call
my_lambda[]
my_lambda.()
my_lambda.===

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

Tạo một mảng được điền trước

Lớp Mảng có thể nhận một đối số + một khối, cho phép bạn tạo một mảng với n các yếu tố. Theo mặc định, các phần tử này là nil , nhưng nếu bạn có một khối, các giá trị sẽ đến từ nó.

Ví dụ :

Array.new(10) { rand 300 }

Điều này sẽ tạo ra một mảng có 10 số ngẫu nhiên nằm trong khoảng từ 0 đến 299.

True, false và nil là các đối tượng

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

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

Đây là mô hình singleton đang hoạt động.

Lambdas nghiêm khắc về lập luận, nhưng 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 mã trực tiếp mà không có irb hoặc tệp

ruby lệnh có một số tùy chọn thú vị mà bạn có thể sử dụng.

Ví dụ:với -e gắn cờ bạn có thể chuyển vào một đoạn mã sẽ được thực thi.

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

Bạn có thể tìm thêm bằng cách sử dụng -h cờ.

Mini-irb của riêng bạn trong một lệnh

Đã từng muốn biết cách irb làm? Chà, đây là một phiên bản siêu đơn giản của nó.

Hãy nhớ ‘REPL’ là viết tắt của gì:Read-Eval-Print Loop.

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

Bạn sẽ không nhận được lời nhắc, nhưng hãy tiếp tục và nhập một số mã Ruby.

"A" * 5
"AAAAA"

Điều này hoạt động vì -n cờ thực hiện điều này:

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

$_ là một biến toàn cục. Trong đó có các nội dung sau:

The last input line of string by gets or readline.

Giải phóng đối tượng (nguy hiểm!)

Không có bất kỳ phương thức Ruby nào để giải phóng một đối tượng mà sử dụng Fiddle bạn có thể tiếp cận với nội bộ Ruby để biến nó thành hiện thự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ử điều này ở nhà!

Đối tượng có danh tính đặc biệt

Các đối tượng Ruby có số nhận dạng hoặc số ‘id’ mà bạn có thể truy cập bằng cách sử dụng object_id phương pháp. 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

Id Fixnum sử dụng công thức này:(số * 2) + 1.

Phần thưởng:Fixnum tối đa là 1073741823 , sau đó bạn nhận được một đối tượng Bignum.

Tránh đầu ra lớn trong irb hoặc pry

Nếu bạn đang làm việc trong irb và muốn tránh lấp đầy màn hình của bạn với nội dung của một số mảng hoặc chuỗi thực sự lớn, bạn chỉ cần thêm ; ở cuối mã của bạn.

Ví dụ :

require 'rest-client'

RestClient.get('www.rubyguides.com');

Hãy thử lại mà không có ; để thấy sự khác biệt 🙂

Sử dụng phương thức người gọi để lấy ngăn xếp cuộc gọi hiện tại

Đây là một ví dụ về mã:

def foo
  bar
end

def bar
  puts caller
end

foo

Đầu ra :

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

Nếu bạn cần tên phương thức hiện tại, bạn có thể sử dụng __method__ hoặc __callee__ .

Tiền thưởng! Chuyển đổi bất kỳ giá trị nào thành boolean

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

Tiền thưởng! Sử 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

Tôi hy vọng bạn thích những thủ thuật Ruby này!

Chia sẻ chúng với bạn bè của bạn để họ cũng có thể thưởng thức chúng & đăng ký blog của tôi trong biểu mẫu bên dưới để bạn sẽ không bỏ lỡ bài đăng tiếp theo của tôi. 🙂