用`round`替换变量的语法糖

时间:2016-03-03 14:08:25

标签: ruby

我们有map!reject!reverse!rotate!等功能。我们还有简短形式的二进制操作,如+=-=

我们有数学round的东西吗?我们需要使用a = a.round,重复变量名称对我来说有点奇怪。你知道如何缩短它吗?

3 个答案:

答案 0 :(得分:2)

至于破坏性方法,因为数字是不可变的,所以是不可能的,这是没有意义的。您想要一个表现为5.2的数字5吗?

至于语法糖,如果每种方法都有一个,那就太乱了。所以没有。由于语法糖是在核心级别定义的,因此您无法在普通的Ruby脚本中执行任何操作来创建新的。

答案 1 :(得分:2)

好的,聪明的家伙已经解释过,为什么Float#round没有语法糖。只是出于好奇,我要展示,你如何自己[部分]实施这种糖。由于Float类没有定义~@方法,并且您经常进行舍入,因此您可以使用monkeypatch Float类:

class Float
  def ~@
    self.round # self is redundant, left just for clarity
  end
end

或者,在这个简单的例子中,只是(信用@sawa):

alias_method :~@, :round

现在:

~5.2
#⇒ 5
a = 2.45 && ~a
#⇒ 2

由于Numeric是不可变的,所以仍然无法在原地进行修改,但上述内容可能会为每个舍入节省四次键盘命中率。

答案 2 :(得分:1)

Ruby的数值类型是不可变的:它们是值对象。因此,您将找不到任何改变数字的方法。

因为数值类型是不可变的,所以可能使用可变数字进行某些优化。例如,在c-ruby中,可以指向任何类型对象的引用通常是指向对象的指针。但是如果引用是Fixnum,那么引用包含整数本身,而不是指向Fixnum的实例。 Ruby做了一些神奇的技巧来隐藏这个优化,看起来整数确实是Fixnum的一个实例。

使数字变为可变会使这种优化变得不可能,所以我不认为Ruby会有可变的数字类型。