2014-01-12 40 views
4

我有以下類:如何在Ruby中將自定義類隱式轉換爲整數?

class Register 
    attr_accessor :val 
    def initialize 
    @val = 0 
    end 
end 

我希望能夠到,鑑於ax=Register.new,類型3 + axax + 3,並得到結果的3 + ax.val相當。我試過搜索,但無法找到這是如何在Ruby中完成的。

+1

爲什麼你想要?使用ax.val有什麼問題,這是明確的,並以所需的方式工作? – pjs

+0

我用它的方式聽起來並不需要,但我想要的是可以將'Register's與'Fixnum's或其他'Register's加在一起。所以我需要能夠同時使用'ax + 3'和'ax + bx',如果使用'val',它將不能用於'Fixnum's。 –

+1

仍然沒有看到爲什麼'ax.val + 3'或'ax.val + bx.val'不足夠。 – pjs

回答

5

對於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這裏。

+0

+1。我想知道如何在我的答案中實現這一點。 – Mohamad

+0

謝謝,我會檢查出強制,我想這正是我所需要的。 –

0

您可以將方法添加到類:

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

相關問題