0

我想定义一个方法,Object该方法需要一个块并将接收器应用于该块。实现将如下所示:

class Object
    def apply ≺ pr.call(self) end
end

2.apply{|x| x * 3} # => 6

是否已经有一种标准方法可以做到这一点,或者有一个众所周知的库有类似用途的方法?如果是这样,我不想重新发明轮子。

我经常遇到这样的情况,我有一个方法,它接受一个可选块,当没有块时,我想返回return_value方法内计算的一些,但是当有块时,我想返回返回值return_value应用于块。现在,我有很多行,例如:

def method ..., &pr
  ...
  pr ? pr.call(return_value) : return_value
end

但我想始终如一地写

def method ..., &pr
  ...
  pr ? return_value.apply(&pr) : return_value
end

甚至更好,对 的定义稍作修改apply

def method ..., &pr
  ...
  return_value.apply(&pr)
end
4

3 回答 3

3

我想Object.tap这就是你要找的东西:

"Abc".tap do |str|
  puts str
end
于 2012-03-06T20:17:34.047 回答
1

那不等同于def apply; yield self; end?– steenslag

@steenslag 是的。这是。我想self作为接收者有这种效果。——萨瓦

你是这个意思吗?

2.instance_eval { * 3 }
# => 6

不幸的是,这不起作用。instance_eval只需像接收者一样运行代码self。运营商不假定self为接收者,所以你实际上必须这样写:

2.instance_eval { self * 3 }
# => 6

但是,作为概念证明,这是可能的:

Numeric.send(:define_method, :plus) { |x| self + x }
2.instance_eval { plus 3 }
# => 5
于 2012-03-06T22:02:10.303 回答
0

(在阅读 OP 的编辑后)AFAIK 编写此代码的规范方法是:

def purpose(*args)  #no &bl or &pr
  res = 42 #huge calculation
  return res unless block_given?
  yield res
end

p purpose(1,2)
purpose{|n| puts "from the block: #{n}"}
于 2012-03-06T22:16:13.603 回答