有没有一种方法可以在不复制变量名称的情况下覆盖变量?例如,当我想将 my_var = '3'
更改为整数时,我必须执行如下操作:
my_var = my_var.to_i
有没有不复制变量名的方法?我想做这样的事情:
my_var = something_const.to_i
对于数字,存在 +=
、-=
等,但是是否有通用的方法可以对所有方法执行此操作?
最佳答案
如果不重复变量名,就无法像那样将字符串转换为整数。 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=
之类的“通用”版本。
您还可以定义改变对象的方法,但只能在适当的时候进行。此类方法通常以 !
命名,称为“bang-methods”,并有一个“non-bang”对应物。例如,在 String
对象上,有 String#capitalize!
(和 String#capitalize
),String#delete!
(和 String#delete
),String#encode!
(和 String#encode
),....但由于上述原因没有 String#to_i!
。
关于ruby - 覆盖变量而不重复名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39557752/