"hello, world!" >> b.dup => "hello, world!" >> a.dup TypeErr-6ren">
gpt4 book ai didi

ruby - 为什么数字不支持 .dup?

转载 作者:数据小太阳 更新时间:2023-10-29 06:56:18 26 4
gpt4 key购买 nike

>> 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。许多 float 在 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 选择不定义dup 立即数。

您的问题比看起来要复杂。有 some discussion关于如何使这更容易的 ruby​​-core。此外,其他类型的数值对象( float 、大数、有理数和复数)不能被复制,尽管它们也不是立即数。

注意 ActiveSupport(rails 的一部分)在所有对象上提供方法 duplicable?

关于ruby - 为什么数字不支持 .dup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1964143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com