3

ハッシュの配列があります

例えば:

cars = [{:company => "Ford", :type => "SUV"},
        {:company => "Honda", :type => "Sedan"},
        {:company => "Toyota", :type => "Sedan"}]

# i want to fetch all the companies of the cars
cars.collect{|c| c[:company]}
# => ["Ford", "Honda", "Toyota"] 

# i'm lazy and i want to do something like this
cars.collect(&:company)
# => undefined method `company' 

上記を実行するための同様のショートカットがあるかどうか疑問に思いました。

4

5 に答える 5

6

cars.collect{|c| c[:company]}任意の配列を列挙する場合は、現在のコードが最善の方法だと思います。配列内の各オブジェクトはタイプであるため、&ショートカットを介して渡すメソッドは、ハッシュで定義されたメソッドである必要がありますHashcompanyメソッドが定義されていないHashため、「undefinedmethod'company'」エラーが発生します。

ただし、ブロックにcars.collect(&:company)渡される各オブジェクトはタイプ(companyメソッドが使用可能)であるため、車の配列を操作している場合に使用できます。したがって、代わりにCarの配列を使用するようにコードを変更できます。collectCar

于 2011-03-29T13:39:40.563 に答える
5

ハッシュをOpenStructsに変換できます。

require 'ostruct'
cars = [{:company => "Ford", :type => "SUV"},
        {:company => "Honda", :type => "Sedan"},
        {:company => "Toyota", :type => "Sedan"}]
cars = cars.map{|car| OpenStruct.new(car)}

p cars.map( &:company )
#=> ["Ford", "Honda", "Toyota"]
于 2011-03-29T14:26:03.217 に答える
0

[]collectではmethodとargument:companyを使用するため、このケースで使用することは不可能です。構文&:companyはラベル:companyを受け取り、に変換するProcため、引数は1つだけです。メソッドの名前です。

于 2011-03-29T14:01:17.943 に答える
0

残念ながら、Rubyハッシュはそれを行うことができません。一方、Clojureマップには、対応する値を返す各キーの関数があります。これは、気が向いている場合は簡単に実行できます(対応するrespond_to?メソッドも追加する必要があります)。

>> class Hash
..   def method_missing(m)
..     self.has_key?(m) ? self[m] : super
..     end
..   end #=> nil
>> cars.collect(&:company) #=> ["Ford", "Honda", "Toyota"]
>> cars.collect(&:compay)
NoMethodError: undefined method `compay' for {:type=>"SUV", :company=>"Ford"}:Hash

注:私はこれをアドバイスしていません、私はそれが可能であると言っているだけです。

于 2011-03-29T14:05:03.363 に答える
0

あなたが実際に使うべきではないもう一つの恐ろしいモンキーパッチ:

class Symbol
  def to_proc
    if self.to_s =~ /bracket_(.*)/
      Proc.new {|x| x[$1.to_sym]}
    else
      Proc.new {|x| x.send(self)}
    end
  end
end

cars = [{:company => "Ford", :type => "SUV"},
        {:company => "Honda", :type => "Sedan"},
        {:company => "Toyota", :type => "Sedan"}]

cars.collect(&:bracket_company)
于 2011-03-29T22:26:00.970 に答える