在Ruby中有没有一种方法可以给变量自赋值一个舍入的浮点数?

dgjrabp2  于 2023-03-12  发布在  Ruby
关注(0)|答案(2)|浏览(116)

我想把var = var.round(2)变成一些东西,比如var = var + 1变成var += 1
在Ruby中有办法做到这一点吗?
我已经尝试过round!方法,但它不像gsub!和其他方法那样工作。

ufj5ltwl

ufj5ltwl1#

这里有一个方法可以做到这一点。

class Float
  def ^(arg)
    round(arg)
  end
end

我们试试看。
x一个一个一个一个x一个一个二个x
这不会导致Float.instance_methods.include?(:^) #=> false问题,尽管将来可能会发生变化。
+=*=-=等称为自赋值表达式,更常见的是assignment operatorsx += 2x赋值的值与x = x + 2相同。请注意,如果x是包含此表达式的方法的参数,则x在调用方法中不会发生变化。
等号前面的运算符表达式可以是以下任意一项,不能是其他任何项:

+  -  *  /  %  **  &  |  ^  <<  >>  &&  ||

其中,以下是Float示例方法

**  %  *  +  -  /

使用其中之一显然是不明智的。
操作符&&||没有实现为方法,所以不能使用,剩下的符号或符号对可以安全地代替我上面的方法^,至少对于当前(我相信是旧的)Ruby版本是这样。

&  |  ^  <<  >>

我相信这个问题是学术性的,只是出于好奇。

l7wslrjt

l7wslrjt2#

不,这是不可能的,因为有些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

因此,没有办法改变一个变量所持有的不可变对象,唯一的办法是使变量指向另一个对象。

相关问题