簡體   English   中英

為什么數字不支持.dup?

[英]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中的一些對象是直接的。 它們按值傳遞,只能有一個這個值,因此不能被欺騙。 這些是任何(小)整數, truefalse ,符號和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 ,而不是將ba指向內存中的相同值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM