ruby - 覆盖变量而不重复名称

标签 ruby performance

有没有一种方法可以在不复制变量名称的情况下覆盖变量?例如,当我想将 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/

相关文章:

ruby - 使用 Ruby 在浏览器中打开图像

python - 通过 Python 和 Ruby 访问 OSX 默认系统的更简单方法?

Javascript变量效率较低

java - 开发人员计算机的防病毒(Symantec Endpoint)配置

performance - 使用 R 从 json 文件构建数据帧时,merge() 的有效替代方法?

javascript - Rails 双渲染

javascript - 如何根据所选字段动态更改表单中的 url 或操作?

ruby - SASS 无效的 css 错误

sql - 在 SQL Server 中分解 HUGE 表是否更好?

android - Encog 在 Android 上运行速度太慢,该怎么办?