相关疑难解决方法(0)

为什么数字不支持.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
Run Code Online (Sandbox Code Playgroud)

我知道Ruby会在每次为新变量赋值时制作副本,但为什么会Numeric#dup引发错误?

这不会打破抽象,因为所有对象都应该被.dup正确地响应吗?

dup据我所知,重写方法将解决问题:

>> class Numeric
>>   def dup()
>>     self
>>   end
>> end
Run Code Online (Sandbox Code Playgroud)

这有没有我看不到的缺点?为什么不将它内置到Ruby中?

ruby abstraction numbers

7
推荐指数
1
解决办法
4949
查看次数

dup和clone都返回不同的对象,但修改它们会改变原始对象

我有一个值数组,当我打印哈希值时,我将其用作订单的参考.我想修改数组,以便数组值"更漂亮".我想我只是复制或克隆数组,更改值,原始对象将保持未被控制.但是(在irb中)......

@arr = ['stuff', 'things']
a = @arr.clone
b = @arr.dup
Run Code Online (Sandbox Code Playgroud)

所以,至少,a和@arr是不同的对象:

a.object_id == @arr.object_id
=> false
Run Code Online (Sandbox Code Playgroud)

但现在它变得奇怪了

a[0].capitalize!
a
=> ['Stuff', 'things']
@arr
=> ['Stuff', 'things'] ##<-what?
b
=> ['Stuff', 'things']## <-what???
Run Code Online (Sandbox Code Playgroud)

好的...所以修改一个会改变其他的,让我们改回来?

a[0] = 'stuff'
a
=> ['stuff', 'things']
@arr
=> ['Stuff', 'things'] ## <- WHAT?????
Run Code Online (Sandbox Code Playgroud)

为了完整性b [1].资本化!具有相同的效果,将所有三个阵列的第二个位置都大写

那么......大写结束时的爆炸会使它变得更加强大吗?足够交叉到其他对象?我知道其他方法,但这对我来说似乎非常奇怪.我认为这与"浅版"有关.建议最好的方法吗?

ruby clone object duplicates

7
推荐指数
1
解决办法
1077
查看次数

标签 统计

ruby ×2

abstraction ×1

clone ×1

duplicates ×1

numbers ×1

object ×1