我理解這x |= y基本上意味著x = x|y. 該運算子|為該類定義為Set計算兩個集合的并集。我們確實可以看到:
require 'set'
r = Set.new(%w(a b));
s = Set.new(%w(c d));
r |= s; # r => #<Set: {"a", "b", "c", "d"}>
但請參閱例如以下類定義:
class Demo;
def initialize(s);
@x = s.dup;
end;
attr_accessor :x;
def m!(t);
x |= t.x; ' <--- HERE TROUBLE!
end;
結尾
我正在使用這個類:
u = Demo.new(Set.new(%w(a b)))
v = Demo.new(Set.new(%w(c d)))
u.m!(v)
如果我現在查看 ux,我會發現它仍然包含集合a,b而不是a,b,c,d。我的感覺是,這是因為我使用了屬性訪問器,尤其是 setter 方法。如果我會寫@x |= t.x,它會起作用。會不會是左側x |= t.x使用了getter x而不是setter x=,從而在臨時 Set 物件中創建了聯合?
順便說一句,我使用的是相當舊的 Ruby 版本(JRuby 1.7.x,大致對應于 Ruby 1.9.3 的語言版本)。
uj5u.com熱心網友回復:
這樣做的原因是在
x = 3
x在 ruby?? 開始尋找方法之前,總是被解釋為區域變數x=。這意味著,您的方法轉換為:
def m!(t)
x = nil # local variable initialization
x = x | t.x
end;
要解決這個問題,您需要使用顯式self強制方法呼叫:
def m!(t);
self.x |= t.x
end
另一個注意事項 - 請不要在 ruby?? 中使用分號。他們只需要極少數情況,但我們通常會避免它們
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/376044.html
標籤:红宝石
上一篇:為什么指定命名引數會改變引數型別
