2016-09-18 92 views
3

是否有覆盖变量而不复制其名称的方法?例如,当我想改变my_var = '3'为整数,我必须做这样的事情:覆盖变量而不重复名称

my_var = my_var.to_i 

有没有办法做到这一点不复制变量的名字?我想要做这样的事情:

my_var = something_const.to_i 

对于数字存在+=-=等,但有普遍的方式,为所有的方法做到这一点?

+0

没有通用的'。='如果这就是你要求的。你为什么需要这个? – ndn

回答

4

没有办法将字符串转换为像这样的整数,而无需重复变量名称。方法如String#upcase!Array#flatten!通过工作变异的对象;但是,不可能定义像String#to_i!这样的方法,因为我们将该对象转换为不同类的实例。

例如,这里是一个(失败)试图定义这样的方法:

# What I want to be able to do: 
# my_var = "123" 
# my_var.to_i! # => my_var == 123 

class String 
    def to_i! 
    replace(Integer(self)) 
    end 
end 

my_var = "123" 
my_var.to_i! # TypeError: no implicit conversion of Fixnum into String 

...而且,即使这个代码是有效的,它仍然提供任何性能增益,因为一个新的对象仍在创建。

至于你的+=-=例子,这些其实都是简单的简写:

x += 1 
# Is equivalent to: 
x = x + 1 

如此反复,没有性能增益这里要么;只是稍微好一些的语法。一个很好的问题是,why doesn't ruby support a ++ operator?如果这样的操作员存在,那么它提供性能增益......但我会让你自己研究为什么这是从语言中缺少。

因此,要总结,

is there universal way to do this for all methods?

号的特殊运营商如+=-=|=&=都是预定义的;没有“广义”版本,如method_name=

您也可以定义变异对象的方法,但只有在适当的时候。这种方法通常以!命名,被称为“爆炸方法”,并有一个“非爆炸”的方法。上String物体,例如,有String#capitalize!(和String#capitalize),String#delete!(和String#delete),String#encode!(和String#encode),....但没有String#to_i!对于上面所讨论的原因。

+0

是的,给一个不可能的问题给一个“例子”有点难;)......也许你使用String#replace的想法是一个更好的尝试,但它仍然失败:TypeError:没有隐式转换Fixnum到字符串。 –

+0

我已经用你的建议更新了我的答案,谢谢:) –