我想把
var = var.round(2)
变成某种东西,比如var = var + 1
变成var += 1
。
有没有办法在 Ruby 中做到这一点?
我已经尝试过
round!
方法,但它不像gsub!
和其他方法那样有效。
这是一种方法。
class Float
def ^(arg)
round(arg)
end
end
来试试吧
x = 2.12345
x ^ 2 #=> 2.12
x #=> 2.12345, x is unchanged
x ^= 2 #=> 2.12
x #=> 2.12, x is assigned the value 2.12
这不应该像
Float.instance_methods.include?(:^) #=> false
一样引起问题,尽管将来可能会改变。
+=
、*=
、-=
等称为 self assignment 表达式,或更常见的是 assignment operators。 x += 2
将与 x
相同的值分配给 x = x + 2
。请注意,如果 x
是包含此表达式的方法的参数,则 x
在调用方法中不会发生变化。
等号前面的运算符表达式允许是以下任何一种,不能是其他:
+ - * / % ** & | ^ << >> && ||
其中,以下是
Float
实例方法
** % * + - /
使用其中之一显然是不明智的。
运算符
&&
和 ||
未作为方法实现,因此无法使用。剩下的符号或符号对可以安全地代替我上面的方法 ^
,至少对于当前(我相信更旧的)Ruby 版本是这样。
& | ^ << >>
我相信这个问题是学术性的,仅仅是出于好奇。
在我看来,您正在尝试做的是修改或改变变量 in place 或 destructively。有些方法是开箱即用的破坏性方法,而其他方法如
gsub
/gsub!
则同时具有破坏性和非破坏性版本。
这里的问题是,Ruby 没有像
Numeric
、String
和 Array
类那样对 Hash
类中的任何东西进行任何破坏性的方法。所以,回答你的问题......不,我认为在 Ruby 中没有任何好的方法不涉及一些不明智的幕后操作。
不,这是不可能的,因为某些 Ruby 类的对象是不可变的。
Ruby 提供了一个方法
#object_id
返回 Ruby 虚拟机中的对象 id。或者你可以使用方法 equal?
判断两个对象是否实际上是内存中的相同对象。
哈希、字符串和数组是可变的,而符号、浮点数和整数是不可变的。
如果你去 irb 你可以看到类似的东西:
irb(main):009:0> 345.object_id
=> 691
irb(main):010:0> 345.object_id
=> 691
irb(main):011:0> 345.6.equal?(345.6)
=> true
irb(main):012:0> {}.equal?({})
=> false
irb(main):013:0> {}.object_id
=> 100360
irb(main):014:0> {}.object_id
=> 111840
所以,没有办法改变变量持有的不可变对象。 唯一的方法是让变量指向另一个对象。