0

Rubyでは、このようにキー名でいくつかのハッシュ値を選択しています

new_values = my_hash.values_at(:value2, :value3, :value6, :value8).select {|a| !a.empty?}

そしてこれはどうですか?動いていない。

new_values = my_hash.values_at(:value2, :value3, :value6, :value8).select(&:!empty?)
4

5 に答える 5

4

Sergioが説明したように、使用している式は解析されないため、標準のRubyでこれを行う方法はありません。何かを一緒にハックして、それが機能するようにすることができます(もちろんreject、ここに行く方法です):

['1', '', '11', ''].select(&fn(:empty?, :!))
#=> ["1", "11"]

これが私の拡張ライブラリfnで使用されているasの実装です:

def fn(*funs)
  -> x do
    funs.inject(x) do |v,f|
      Proc === f ? f.call(v) : v.send(f)
    end
  end
end
于 2012-09-04T10:30:35.493 に答える
3

name のメソッドがないため、機能しません!empty?。そして、この名前はルビーでは違法です。(最初のスニペットのように)完全なラムダ形式を使用するか、使用する必要がありますreject

['1', '', '11', ''].select(&:empty?) # => ["", ""]
['1', '', '11', ''].reject(&:empty?) # => ["1", "11"]
于 2012-09-04T10:20:58.840 に答える
0

ここでの私の答えの精神で:

class Symbol
  def on
    ->(*args) { yield(*args).send(self) }
  end
end

['1', '', '11', ''].select(&:!.on(&:empty?))
# => ["1", "11"] 
于 2014-06-03T08:49:53.617 に答える
0

の逆メソッドはempty?ですany?。これで、使用することで目標を達成できます

new_values = my_hash.values_at(:value2, :value3, :value6, :value8).select(&:any?)
于 2012-09-04T10:44:46.003 に答える