【问题标题】:how do I declare const variables in ruby/rails如何在 ruby​​/rails 中声明 const 变量
【发布时间】:2013-01-15 23:35:13
【问题描述】:

我想成为一个更好的代码.. 让我的代码更简洁、更易读。

我在 c/c++ 中看到的一件事是对局部变量使用 const。我认为告诉读者我的代码一旦设置了变量,它就不会在函数/方法中更改,这是很有价值的。

我想知道....有没有办法表明局部变量是 const 的?

#for example 
sql = "select * from table1 where status = #{iStatusId}"
connection.execute(sql)

sql 在这个方法中不会改变。我可以这样标记吗?

好吧..这是一个不好的例子,但我认为重点是......我希望:)

编辑: 我在 sql 中添加了一些动态 .. iStatusId 位是传递给方法的参数。

编辑2: 我确实在谷歌上搜索过这个......所有文章都谈到了幻数替换。这很简单,我认为是 MACRO。 CONTATS 很简单...我正在寻找 const.. 它们是非常不同的东西。

【问题讨论】:

  • 你试过谷歌搜索吗?
  • 你知道那里有 SQL 注入吗?
  • @daveatflow 喜欢方法大小、类大小、命名、使用规范样式、格式、适当的类设计等。表明字符串不会改变几乎没有列出我的清单。
  • @daveatflow 很难在 Ruby 中创建一个常量,在一个方法中,IMO 它毫无价值。
  • @daveatflow “他们在那里,他们必须有价值。”危险的想法,AFAIC。您对它们为什么不存在的推理是有缺陷的; Java 可以跳过原语并且只有引用并且仍然有final。再说一遍:在一个指示值不会改变的方法内部,IMO 的价值很小。对于配置值、默认值等,它们确实具有价值——但在 Ruby 中它们只是勉强“恒定”。

标签: ruby-on-rails coding-style constants


【解决方案1】:

通过使用类似这样的东西来制作您所描述的逻辑很容易:

class Thing

    def unchangeable_attribute
      @unchangeable_attribute
    end

    def unchangeable_attribute=(value)
      raise SomeError if @unchangeable_attribute
      @unchangeable_attribute = value
    end

end

不过,我倾向于同意 Dave Newton 的观点,因为我很难想象这样的事情会有一个很好的用例......

【讨论】:

  • 在其他语言中,const 被编译为更小更快的代码。他们让其他人更难使用你的变量来搞砸他们,考虑到我的大多数同事都很“年轻”,这帮助了我。
  • 对...这也是这样做的,除了“编译为更小更快的代码”可能的例外。可能有更好的方法来完成您想要实现的目标,例如强大的测试套件,但这使得属性只能设置一次。
  • 哦,更好的链接.. PS 谢谢布拉德.. 真的谢谢... 也感谢戴夫.. gotw.ca/gotw/006.htm
  • FWIW,我对“是否值得”的辩论并不真正感兴趣——如果你有一个合法的用例,做你需要的,但看起来你真的在尝试写Ruby 中的 c(或其他东西)。
【解决方案2】:

Ruby 对象上定义的obj.freeze 方法呢?来自docs:

防止对 obj 的进一步修改。如果尝试修改,将引发 RuntimeError。无法解冻冻结的对象。

【讨论】:

    【解决方案3】:

    常量仅以大写字母开头,因此以下内容可以正常工作:

    MY_CONSTANT = 1234
    

    但是,可以覆盖常量,尽管它会发出警告。

    【讨论】:

      【解决方案4】:

      Ruby 中的 const 不是严格合乎逻辑的。由于“所有”变量实际上只是指向对象的掩码指针,因此将它们转换为 const 的 c 范式是没有意义的。

      这将等于 const void * value = 'bla';

      您仍然可以更改值[1]。

      我很想在这里被证明是错误的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        • 2021-11-28
        • 1970-01-01
        • 2018-07-12
        • 2023-03-27
        • 2021-12-25
        相关资源
        最近更新 更多