是这样的:给定一个foo
对象数组,它们的属性为bar
,该属性还具有一个名为baz
的属性:
foos.each(&:bar.baz)
我可以很容易地用bar
来获得所有foos.each(&:bar)
,但是我不能拥有baz
属性(或者可能有很多其他属性),因为它给了我错误:
TypeError: wrong argument type String (expected Proc)
答案 0 :(得分:5)
答案 1 :(得分:3)
Array#each返回其接收者,因此它可能不是您所寻找内容的最佳示例。假设我们有
https://login.microsoftonline.com/te/your-tenant-name.onmicrosoft.com/oauth2/authresp
想要
arr = [['a', 'b'], ['c', 'd']]
要使用一个和号,可以写一个
arr.map(&:first).map(&:upcase)
#=> ["A", "C"]
arr.map(&Proc.new { |e| e.first.upcase })
#=> ["A", "C"]
将proc转换为块,导致
&
要执行。
答案 2 :(得分:2)
&符冒号运算符是否可能
不。主要是因为没有“和号冒号”这样的东西。这个
<activity
android:name=".DetailActivity"
android:theme="@style/DetailTheme"/>
是编写此内容的一种较短方法
foos.each(&:bar)
另请参阅其他答案。
答案 3 :(得分:1)
最好的选择是只使用常规的块语法:
&:sym
例如,由于方法名称是动态的,如果您仍想使用foos.each(&Xf.pipe(:bar, :baz))
类型的语法,则可以签出Xf gem。它使您能够:
def pipe(*fns)
Proc.new do |target|
new_value = target
fns.each { |fn| new_value = fn.to_proc.call(new_value) }
new_value
end
end
require 'ostruct'
# openstruct used to emulate objects that would respond to .foo.bar
foos = []
foos << OpenStruct.new(foo: OpenStruct.new(bar: 'hello'))
foos << OpenStruct.new(foo: OpenStruct.new(bar: 'world'))
foos.each(&pipe(:foo, :bar))
您可以简单地通过使用pipe
方法来复制功能而无需包含gem:
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)