2014-06-05 14 views
12

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áchtạ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.

+0

'self.bar || = 'baz'' nghĩa 'tự .bar || self.bar = 'baz''. –

+0

@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? –

+0

@ 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 ... –

Trả lời

6

Trông giống như bug.

CẬP NHẬT: bugfixed trong thân cây và là slated for back porting to 2.1 and 2.0.

Lưu ý rằng vấn đề tổng quát hơn đó, nó được chia cho tất cả bài tập viết tắt, không chỉ có điều kiện tập viết tắt:

private def foo=(*) end 
public def foo; 0 end 

self.foo = 42 

self.foo += 42 
# private method `foo=' called for main:Object (NoMethodError) 

private :foo 

self.foo += 42 
# private method `foo' called for main:Object (NoMethodError) 
+0

Có. Đó là một lỗi. Tôi chuẩn bị đăng nhập. Nhưng nó là tốt trước khi đến đó, tôi đến đây ... –

+0

Cảm ơn bạn đã cập nhật .. –

Các vấn đề liên quan