【问题标题】:What kind of Ruby variable do I want to use here?我想在这里使用什么样的 Ruby 变量?
【发布时间】:2011-08-16 04:49:09
【问题描述】:

我还在学习 Ruby,我很好奇在这种情况下使用类变量、常量还是局部变量是否合适。

在我下面的代码示例中(从固定字符集中生成随机用户名),将@username 分配为实例变量是相当明显的。但我很好奇我应该将字符集分配为常量还是类变量。在这种情况下使用另一种变量类型有什么好处?

在当前示例中,_charset 在每个实例中计算。 (如果我的假设是错误的,请纠正我。)我还假设计算将作为类变量和常量在实例之间共享(而不是重新计算)?

class NewAccount

  def initialize
    @username = self.generate_username
  end

  def generate_username
    _charset = ('a'..'z').to_a + ('0'..'9').to_a
    _newusername = Array.new(20) { _charset[rand(_charset.length)] }.join
    return _newusername
  end

end

【问题讨论】:

  • 请注意 a) 使用带有前导下划线的 _variables 和 b) 显式返回是方法的最后一个表达式,这不是 Ruby 的惯用语。此外,您可以将该行写为: new_username = 20.times.map { charset.choice }.join
  • 另一种创建用户名的方法是:@username = rand(36**20).to_s(36)

标签: ruby constants scope instance-variables local-variables


【解决方案1】:

您可以将其设为类变量或常量,实际上这将是相同的:只存在一个实例。并且 Ruby 常量并不是真正的常量——你可以改变一个常量,所以它实际上是一个变量,只是因为它的名字 Ruby 可以识别一个常量,如果你试图改变它就会发出警告。

但是通过将其声明为常量而不是类变量,您就是在记录您的目标:拥有一个由字符集组成的常量值,该值不会被更改。这对于任何阅读代码的人来说都是显而易见的。这就是您想要的字符集 - 就这样做吧。

如果你把它变成一个类变量,它就会是一个变量:所以如果有人试图改变它也没问题。当然,如果您出于某种原因计划更改其值,请使用类变量:再次记录您的设计。

【讨论】:

    【解决方案2】:

    因为_charset = ('a'..'z').to_a + ('0'..'9').to_a 永远不会改变它的定义,所以我将它创建为一个类常量:

    class NewAccount
    
      CHARSET = ('a'..'z').to_a + ('0'..'9').to_a
    
      def initialize
        @username = self.generate_username
      end
    
      def generate_username
        _newusername = Array.new(20) { CHARSET[rand(CHARSET.length)] }.join
        return _newusername
      end
    
    end
    

    【讨论】:

      【解决方案3】:

      我认为您可以将其设为类变量,因为 _charset 将仅在 NewAccount 类中使用,并且它的值不会因 NewAccount 的实例而改变。

      【讨论】:

        【解决方案4】:

        在您的示例中,@username 将为每个实例计算一次,而 _charset 在您的示例中仅计算一次 - 但 _charset 只是一个局部变量,因此如果您运行该方法两次,它将被重新计算。

        你想要的是铁皮人建议的,将它设置为常数并计算一次。使用类变量 (@@charset) 可能会产生误导,因为字符集不会随时更改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-19
          • 1970-01-01
          • 2010-11-22
          • 2017-06-10
          • 1970-01-01
          • 2021-04-20
          • 1970-01-01
          • 2023-03-10
          相关资源
          最近更新 更多