首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >方法,该方法返回Ruby中对象的收益率

方法,该方法返回Ruby中对象的收益率
EN

Stack Overflow用户
提问于 2011-09-28 19:03:35
回答 3查看 678关注 0票数 4

Ruby中有没有一个方法可以返回传递给对象的块的内容?

例如,如果我有一个想要放入数组中的对象,该怎么办?

在理想的情况下,我们会这样做(我正在寻找的):

代码语言:javascript
复制
"string".reverse.upcase.something{ |s| send(s) }

它将返回一个包含我的对象的数组,等同于:

代码语言:javascript
复制
send("string".reverse.upcase)

如果我从我的对象开始,那么它是不可链接的,并且在更复杂的场景中可能会变得混乱。

因此,与Array#map一样,something方法将返回块的计算结果,但只针对一个元素。

EN

回答 3

Stack Overflow用户

发布于 2011-09-28 19:44:08

我不知道有这样一个内置的东西,但你可以很容易地自己做:

代码语言:javascript
复制
class Object
  def something(&block)
    block.call(self)
  end
end

p "foo".something { | o | [o] }
p 23.something { | x | p x; 42 }

给出

代码语言:javascript
复制
["foo"]      # object "foo" put into an array
23           # object handed to block
42           # something return block's result
票数 4
EN

Stack Overflow用户

发布于 2011-09-28 19:28:08

你在找Object.tap吗?

票数 1
EN

Stack Overflow用户

发布于 2014-04-15 16:48:49

我有时希望在标准库中有一个类似的函数。例如,该名称可以是withwith_it

(用新名称重复以前的代码)

代码语言:javascript
复制
class Object
  def with_it(&block)
    block.call(self)
  end
end

示例用法:

代码语言:javascript
复制
x = [1, 2, 3, 4, 5].map {|x| x * x }.with_it do |list|
   head = list.unshift
   list << head * 10
   list.join " / "
end

与此相对的是:

代码语言:javascript
复制
list = [1, 2, 3, 4, 5].map {|x| x * x }
head = list.unshift
list << head * 10
x = list.join " / "

虽然后者更容易理解,但前者的好处是保持变量listhead的作用域,而且在我看来,对x的赋值更加清晰(对x的赋值必须插入到代码的最后一行)。如果代码是更大方法的一部分,作用域将是一个优势。

因此,使用with_it的另一种选择是将代码放在单独的方法中。例如:

代码语言:javascript
复制
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包含在标准库中

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7582222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档