Ruby中有没有一个方法可以返回传递给对象的块的内容?
例如,如果我有一个想要放入数组中的对象,该怎么办?
在理想的情况下,我们会这样做(我正在寻找的):
"string".reverse.upcase.something{ |s| send(s) }
它将返回一个包含我的对象的数组,等同于:
send("string".reverse.upcase)
如果我从我的对象开始,那么它是不可链接的,并且在更复杂的场景中可能会变得混乱。
因此,与Array#map
一样,something
方法将返回块的计算结果,但只针对一个元素。
发布于 2011-09-28 19:44:08
我不知道有这样一个内置的东西,但你可以很容易地自己做:
class Object
def something(&block)
block.call(self)
end
end
p "foo".something { | o | [o] }
p 23.something { | x | p x; 42 }
给出
["foo"] # object "foo" put into an array
23 # object handed to block
42 # something return block's result
发布于 2011-09-28 19:28:08
你在找Object.tap吗?
发布于 2014-04-15 16:48:49
我有时希望在标准库中有一个类似的函数。例如,该名称可以是with
或with_it
(用新名称重复以前的代码)
class Object
def with_it(&block)
block.call(self)
end
end
示例用法:
x = [1, 2, 3, 4, 5].map {|x| x * x }.with_it do |list|
head = list.unshift
list << head * 10
list.join " / "
end
与此相对的是:
list = [1, 2, 3, 4, 5].map {|x| x * x }
head = list.unshift
list << head * 10
x = list.join " / "
虽然后者更容易理解,但前者的好处是保持变量list
和head
的作用域,而且在我看来,对x
的赋值更加清晰(对x
的赋值必须插入到代码的最后一行)。如果代码是更大方法的一部分,作用域将是一个优势。
因此,使用with_it
的另一种选择是将代码放在单独的方法中。例如:
def mult_head_and_join(list)
head = list.unshift
list << head * 10
list.join " / "
end
x = mult_head_and_join [1, 2, 3, 4, 5].map {|x| x * x }
我不确定在这里得出什么结论,但我想我会投票支持将with_it包含在标准库中
https://stackoverflow.com/questions/7582222
复制相似问题