有没有办法在 Ruby 中自行将舍入浮点数分配给变量?

问题描述 投票:0回答:3

我想把

var = var.round(2)
变成某种东西,比如
var = var + 1
变成
var += 1

有没有办法在 Ruby 中做到这一点?

我已经尝试过

round!
方法,但它不像
gsub!
和其他方法那样有效。

ruby floating-point rounding
3个回答
2
投票

这是一种方法。

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 版本是这样。

&  |  ^  <<  >> 

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


0
投票

在我看来,您正在尝试做的是修改或改变变量 in placedestructively。有些方法是开箱即用的破坏性方法,而其他方法如

gsub
/
gsub!
则同时具有破坏性和非破坏性版本。

这里的问题是,Ruby 没有像

Numeric
String
Array
类那样对
Hash
类中的任何东西进行任何破坏性的方法。所以,回答你的问题......不,我认为在 Ruby 中没有任何好的方法不涉及一些不明智的幕后操作。


-3
投票

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

所以,没有办法改变变量持有的不可变对象。 唯一的方法是让变量指向另一个对象。

© www.soinside.com 2019 - 2024. All rights reserved.