2017-01-04 17 views
23

Chỉ cần tò mò về nó.Hành vi lạ với '_' (gạch dưới) trong Ruby

Nếu bạn mở IRB và gõ _, bạn sẽ nhận được nil như phản ứng:

irb(main):001:0> _ 
=> nil 

Và bạn có thể thay đổi giá trị của nó:

irb(main):002:0> _ = 'some value' 
irb(main):003:0> _ 
=> "some value" 

Nhưng nếu bạn tạo một biến mới với _, giá trị của nó được sửa đổi:

irb(main):004:0> foo_bar = 'other value' 
irb(main):005:0> _ 
=> "other value" 

Tại sao? Đây có phải là quyết định thiết kế không?

+1

Đó thực sự là một tính năng tiện dụng. Nếu bạn muốn lưu kết quả của hoạt động cuối cùng của bạn: 'a = _'. Tôi thường sử dụng 'irb' như một máy tính tiện dụng, vì vậy bạn có thể dễ dàng xâu chuỗi những thứ: '_/1e6' chẳng hạn. – tadman

+0

Một số ý nghĩa thú vị hơn cho gạch dưới được trình bày [Ở đây] (http://idiosyncratic-ruby.com/33-too-expressive.html#underscore-4-syntactical-meanings) chẳng hạn như dấu phân tách hình ảnh ('1_000_000') hoặc tham số bị bỏ qua 'object.each {| _, v | ...} ' – engineersmnky

Trả lời

34

irb sử dụng _ để tham chiếu đến giá trị của biểu thức được tính cuối cùng. Vì vậy, bạn sẽ thấy _ thay đổi ngay cả khi bạn không sử dụng nó ở dòng trước :)

+0

http://rubyquicktips.com/post/342527837/console-tip-retrieve-the-last-return-value-with – Suborx

16

Trong vòng irb, _ trả về kết quả của thao tác trước đó. Vì vậy, khi mở một phiên irb mới _ sẽ bằng 0 vì không có hoạt động nào trước đây

2.0.0p353 :001 > 4 
=> 4 
2.0.0p353 :002 > 3 + _ 
=> 7