9

_id.to_srubyで使用するブロックを呼び出すにはどうすればよいですか?

category_ids = categories.map(&:_id.to_s)

私はそれをハッキングして、現在次のことを行っています。

category_ids = []
categories.each do |c|
  category_ids << c.id.to_s
end
4

3 に答える 3

13

ブロックを渡してマップし、式をブロック内に配置できます。列挙可能な各メンバーは、ブロックに続いて譲歩されます。

category_ids = categories.map {|c| c._id.to_s }
于 2013-02-04T15:48:19.037 に答える
7
category_ids = categories.map(&:_id).map(&:to_s)

テスト:

categories = ["sdkfjs","sdkfjs","drue"]
categories.map(&:object_id).map(&:to_s)
=> ["9576480", "9576300", "9576260"]
于 2013-02-04T16:32:50.627 に答える
2

本当にメソッドを連鎖させたい場合は、Symbol#to_proc をオーバーライドできます

class Symbol
  def to_proc
    to_s.to_proc
  end
end

class String
  def to_proc
    split("\.").to_proc
  end
end

class Array
  def to_proc
    proc{ |x| inject(x){ |a,y| a.send(y) } }
  end
end

strings_arr = ["AbcDef", "GhiJkl", "MnoPqr"]
strings_arr.map(&:"underscore.upcase")
#=> ["ABC_DEF", "GHI_JKL", "MNO_PQR"]

strings_arr.map(&"underscore.upcase")
#=> ["ABC_DEF", "GHI_JKL", "MNO_PQR"]

strings_arr.map(&["underscore", "upcase"])
#=> ["ABC_DEF", "GHI_JKL", "MNO_PQR"]

category_ids = categories.map(&"id.to_s")

Ruby アンパサンド コロン ショートカット

IRB

于 2016-04-01T09:41:34.930 に答える