如何在ruby中使用map方法调用方法链?

10

我该如何在Ruby中调用块来使用_id.to_s

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

我正在黑客攻击它并执行以下操作:
category_ids = []
categories.each do |c|
  category_ids << c.id.to_s
end

1
Enumerable#map 的文档展示了如何使用块。你看过吗? - the Tin Man
3个回答

15
你可以将一个代码块传递给map方法,并在代码块中放入你的表达式。可枚举对象的每个成员将被依次传递给该代码块。
category_ids = categories.map {|c| c._id.to_s }

1
从 Ruby 2.7 开始,您可以使用类似以下的编号参数:categories.map { _1._id.to_s } - fn control option

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

测试:

categories = ["sdkfjs","sdkfjs","drue"]
categories.map(&:object_id).map(&:to_s)
=> ["9576480", "9576300", "9576260"]

如果性能对于此问题至关重要,您可以考虑使用Enumerator::Lazy,正如相关问答中的评论所指出的 - Cadoiz

4

如果你真的想要链式调用方法,你可以重写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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接