我有以下類:如何在Ruby中將自定義類隱式轉換爲整數?
class Register
attr_accessor :val
def initialize
@val = 0
end
end
我希望能夠到,鑑於ax=Register.new
,類型3 + ax
或ax + 3
,並得到結果的3 + ax.val
相當。我試過搜索,但無法找到這是如何在Ruby中完成的。
我有以下類:如何在Ruby中將自定義類隱式轉換爲整數?
class Register
attr_accessor :val
def initialize
@val = 0
end
end
我希望能夠到,鑑於ax=Register.new
,類型3 + ax
或ax + 3
,並得到結果的3 + ax.val
相當。我試過搜索,但無法找到這是如何在Ruby中完成的。
對於ax + 3
工作,你需要在你的類中定義的方法+
:
def +(other)
@value + other
end
然而,3 + x
仍然會導致錯誤的解釋不會有線索如何與一個Fixnum
結合你的班級的實例。爲了解決這個問題,定義coerce
方法是這樣的:
def coerce(other)
if other.is_a?(Fixnum)
[other, @value]
else
super
end
end
我就不細講了如何coerce
作品我們已經有了一個great answer這裏。
+1。我想知道如何在我的答案中實現這一點。 – Mohamad
謝謝,我會檢查出強制,我想這正是我所需要的。 –
您可以將方法添加到類:
class Register
attr_accessor :val
def initialize
@val = 0
end
def +(x)
@val + x
end
end
a = Register.new
a + 5 # => 5
需要注意的是,這種方法可以讓你打電話a + 5
但不5 + a
。如果您嘗試,您會得到TypeError: Register can't be coerced into Fixnum
。
爲什麼你想要?使用ax.val有什麼問題,這是明確的,並以所需的方式工作? – pjs
我用它的方式聽起來並不需要,但我想要的是可以將'Register's與'Fixnum's或其他'Register's加在一起。所以我需要能夠同時使用'ax + 3'和'ax + bx',如果使用'val',它將不能用於'Fixnum's。 –
仍然沒有看到爲什麼'ax.val + 3'或'ax.val + bx.val'不足夠。 – pjs