Từ mã bên dưới, có vẻ như toán tử ||=
đang được đánh giá từ bên ngoài lớp học.Ruby Điều kiện-Chuyển nhượng và Phương pháp Riêng tư
class Foo
attr_reader :bar
def baz
self.bar ||= 'baz'
end
private
attr_writer :bar
end
puts Foo.new.baz
# => in `baz': private method `bar=' called for #<Foo:0x007fd9720829a8> (NoMethodError)
Trích dẫn từ câu trả lời chấp nhận trên Official expansion of ||= conditional assignment operator:
In other words, the expansion c = c || 3 is (excluding bugs like in pre-1.9) correct.
Viết lại phương pháp baz
như self.bar = self.bar || 'baz'
không làm tăng lỗi.
Tôi đang tìm câu trả lời cuối cùng trên cách và tại sao Ruby hoạt động theo cách này, vì nó có vẻ phản trực giác.
Hành vi này hiện diện trên các phiên bản Ruby 1.9.3, 2.0.0 và 2.1.2, điều này khiến tôi tin rằng đây không phải là lỗi.
'self.bar || = 'baz'' nghĩa 'tự .bar || self.bar = 'baz''. –
@ArupRakshit nhưng nó vẫn không giải thích lý do tại sao nó ném một lỗi, phải không? –
@ FarrukhAbdulkadyrov Đó không phải là lời giải thích, đó là cho OP. người đã giải thích cú pháp '|| =' sai ... –