[英]Why don't numbers support .dup?
>> a = 5
=> 5
>> b = "hello, world!"
=> "hello, world!"
>> b.dup
=> "hello, world!"
>> a.dup
TypeError: can't dup Fixnum
from (irb):4:in `dup'
from (irb):4
我知道Ruby每次為新變量賦值時都會復制,但為什么Numeric#dup
引發錯誤?
這不會破壞抽象,因為所有對象都應該被正確地響應.dup
嗎?
重寫dup
方法將解決問題,據我所知:
>> class Numeric
>> def dup()
>> self
>> end
>> end
這有沒有我看不到的缺點? 為什么不將它內置到Ruby中?
Ruby中的大多數對象都是通過引用傳遞的,可以復制。 例如:
s = "Hello"
t = s # s & t reference to the same string
t.upcase! # modifying either one will affect the other
s # ==> "HELLO"
但Ruby中的一些對象是直接的。 它們按值傳遞,只能有一個這個值,因此不能被欺騙。 這些是任何(小)整數, true
, false
,符號和nil
。 在64位系統上的Ruby 2.0中,許多浮點數也是最重要的。
在這個(荒謬的)示例中,任何“42”都將保存相同的實例變量。
class Fixnum
attr_accessor :name
alias_method :original_to_s, :to_s
def to_s
name || original_to_s
end
end
42.name = "The Answer"
puts *41..43 # => 41, The Answer, 43
由於您通常期望something.dup.name = "new name"
不會影響使用dup
獲得的副本之外的任何其他對象,因此Ruby選擇不在immediates上定義dup
。
你的問題比它看起來更復雜。 關於如何使這更容易, 討論了ruby-core。 此外,其他類型的數字對象(浮點數,bignums,有理數和復數)也不能被欺騙,盡管它們也不是中立的。
請注意,ActiveSupport(rails的一部分)提供了可重復的方法duplicable?
在所有對象上
您定義的dup()
函數的問題是它不返回對象的副本 ,而是返回對象本身。 這不是duplicate
程序應該做的事情。
我不知道Ruby,但是我可以想到沒有為數字定義dup
一個可能原因是數字是一個基本類型,因此,做類似的事情:
>> a = 5
>> b = a
會自動將值5
分配給變量b
,而不是將b
和a
指向內存中的相同值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.