0

いくつかのメソッドに応答するオブジェクトがあるとします。それらのいくつかをハッシュに集めたい、私はいつもこのように切り取って書いています。

class Person
  # ...

  def some_selected_attributes
    attrs = {}
    [:first_name, :last_name, :zip].each do |attr|
      attrs[attr] = self.__send__(attr)
    end
    attrs
  end
end

これを行うためのよりエレガントな方法があると思います。

:wq!

4

3 に答える 3

2

属性は 3 つしかないので、直接記述しない理由はないと思います。

def some_selected_attributes
  {
    first_name: first_name,
    last_name: last_name,
    zip: zip
  }
end

次の方法でも実行できますinject

def some_selected_attributes
  [:first_name, :last_name, :zip].inject({}) do |hash, attr|
    hash[attr] = __send__ attr
    hash
  end
end

を使用した別のオプションHash[]

def some_selected_attributes
  Hash[[:first_name, :last_name, :zip].map {|attr| [attr, __send__ attr] }]
end
于 2012-04-05T23:41:08.020 に答える
1

本当にハッシュが必要な場合は、LBg がいくつかの細かいパターンを提供しています。ただし、プリミティブ ハッシュの代わりに小さな構造体オブジェクトを作成することを検討することもできます。構造体は、インデックス作成と列挙のためのハッシュのように動作しますが、アクセサー メソッドも備えているため、send およびドット表記で使用できます。

class Person
  # ...
  SomeSelectedPersonAttrs = Struct.new :first_name, :last_name, :zip

  def some_selected_attributes
    SomeSelectedPersonAttrs[ * SomeSelectedPersonAttrs.members.map{|a| send a } ]
  end

end

pa = person.some_selected_attributes
pa.first_name    # => "Joe"
pa[:first_name]  # => "Joe"
pa['first_name'] # => "Joe"
p.zip = 12345    # sets zip to 12345
p[:zip] = 12345
p['zip'] = 12345

pa.values       # => ["Joe","Blow",12345]
pa.each_pair {|k,v| ... }
于 2012-04-06T02:29:56.383 に答える
-1

あなたがやろうとしていることを達成するためのより良い方法があると思います。すでにクラスにある引数のハッシュを返すメソッドを書くのはあまり意味がありません。attr_accessor を使用して、インスタンス変数またはメソッドにアクセスできるようにするだけです。

class Person
  attr_accessor :first_name, :last_name, :zip

end

その場合、 some_selected_attributes() メソッドは必要ありません。変数またはメソッドに直接アクセスできます。

p = Person.new
p.first_name  # => value of first_name

ハッシュが必要な場合は、次のように作成できます。

p = Person.new
hash = {:first_name => p.first_name, :last_name => p.last_name, :zip => p.zip }

なぜこのハッシュを構築したいのかわかりません。あなたがやろうとしていることを達成するためのより「オブジェクト指向」な方法のようです(オブジェクト全体を引数として渡すことによって)。

選択したフィールドのハッシュを操作する代わりに、オブジェクト全体を操作することをお勧めします。

于 2012-04-06T03:29:34.713 に答える