具有数组属性的 Ruby 类

kid*_*rew 2 ruby

我在 Ruby 中有一个非数据库支持的类:

class User
  attr_accessor :countries
end
Run Code Online (Sandbox Code Playgroud)

我希望国家只是一组 ISO 国家代码(美国、GB、CA、AU 等),我不想建立一个单独的模型来保存每个国家代码。有没有一种神奇的方法可以让 Ruby 理解这:countries是一个数组并相应地对待它,或者我是否需要编写countriesandcountries=方法?

我尝试使用 user.countries = ['US'] 设置国家数组,但我收到了 NoMethodError。

Dav*_*ton 5

变量的类型在 Ruby 中无关紧要。

attr_accessor只创建设置和返回实例变量的 getter 和 setter 方法;@countries在这种情况下。您可以将实例变量设置为数组,或使用 setter:

class User
  attr_accessor :countries

  def initialize
    @countries = %w[Foo Bar Baz]
    # Or...
    self.countries = %w[Foo Bar Baz]
  end
end

> puts User.new.countries
=> ["Foo", "Bar", "Baz"]
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢使用实例变量而不是self.xxx; 忘记这self.一点太容易了,你最终设置了一个局部变量,留下了实例变量nil。我也觉得丑

如果国家不会在实例之间发生变化,为什么不是一个常数?

编辑/澄清

塔德曼的观点很好理解,例如,对国家的这种谩骂。我不关心的情况仅限于小型的、自我控制的、独立的类。做出这些假设存在固有风险,这些风险的水平取决于项目。