我想把var = var.round(2)变成一些东西,比如var = var + 1变成var += 1。在Ruby中有办法做到这一点吗?我已经尝试过round!方法,但它不像gsub!和其他方法那样工作。
var = var.round(2)
var = var + 1
var += 1
round!
gsub!
ufj5ltwl1#
这里有一个方法可以做到这一点。
class Float def ^(arg) round(arg) end end
我们试试看。x一个一个一个一个x一个一个二个x这不会导致Float.instance_methods.include?(:^) #=> false问题,尽管将来可能会发生变化。+=、*=、-=等称为自赋值表达式,更常见的是assignment operators。x += 2为x赋值的值与x = x + 2相同。请注意,如果x是包含此表达式的方法的参数,则x在调用方法中不会发生变化。等号前面的运算符表达式可以是以下任意一项,不能是其他任何项:
Float.instance_methods.include?(:^) #=> false
+=
*=
-=
x += 2
x
x = x + 2
+ - * / % ** & | ^ << >> && ||
其中,以下是Float示例方法
Float
** % * + - /
使用其中之一显然是不明智的。操作符&&和||没有实现为方法,所以不能使用,剩下的符号或符号对可以安全地代替我上面的方法^,至少对于当前(我相信是旧的)Ruby版本是这样。
&&
||
^
& | ^ << >>
我相信这个问题是学术性的,只是出于好奇。
l7wslrjt2#
不,这是不可能的,因为有些Ruby类的对象是不可变的。Ruby提供了一个方法#object_id,它在Ruby虚拟机中返回一个对象id,或者可以使用方法equal?来判断两个对象在内存中是否实际上是同一个对象。哈希、字符串和数组是可变的,而符号、浮点和整数是不可变的。如果你去irb,你会看到这样的东西:
#object_id
equal?
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
因此,没有办法改变一个变量所持有的不可变对象,唯一的办法是使变量指向另一个对象。
2条答案
按热度按时间ufj5ltwl1#
这里有一个方法可以做到这一点。
我们试试看。
x一个一个一个一个x一个一个二个x
这不会导致
Float.instance_methods.include?(:^) #=> false
问题,尽管将来可能会发生变化。+=
、*=
、-=
等称为自赋值表达式,更常见的是assignment operators。x += 2
为x
赋值的值与x = x + 2
相同。请注意,如果x
是包含此表达式的方法的参数,则x
在调用方法中不会发生变化。等号前面的运算符表达式可以是以下任意一项,不能是其他任何项:
其中,以下是
Float
示例方法使用其中之一显然是不明智的。
操作符
&&
和||
没有实现为方法,所以不能使用,剩下的符号或符号对可以安全地代替我上面的方法^
,至少对于当前(我相信是旧的)Ruby版本是这样。我相信这个问题是学术性的,只是出于好奇。
l7wslrjt2#
不,这是不可能的,因为有些Ruby类的对象是不可变的。
Ruby提供了一个方法
#object_id
,它在Ruby虚拟机中返回一个对象id,或者可以使用方法equal?
来判断两个对象在内存中是否实际上是同一个对象。哈希、字符串和数组是可变的,而符号、浮点和整数是不可变的。
如果你去irb,你会看到这样的东西:
因此,没有办法改变一个变量所持有的不可变对象,唯一的办法是使变量指向另一个对象。