Ruby 将self应用于进程的方法

Ruby 将self应用于进程的方法,ruby,ruby-1.9.3,proc-object,Ruby,Ruby 1.9.3,Proc Object,我想在对象上定义一个方法,该方法获取一个块并将接收器应用于该块。实现如下所示: class Object def apply ≺ pr.call(self) end end 2.apply{|x| x * 3} # => 6 是否已经有一个标准的方法来实现这一点,或者有一个著名的库具有类似的使用方法?如果是这样的话,我不想重新发明轮子 我经常遇到这样的情况,我有一个方法,它接受一个可选块,当没有块时,我想返回一些在方法中计算的return\u值,但当有块时,我想返

我想在
对象
上定义一个方法,该方法获取一个块并将接收器应用于该块。实现如下所示:

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

2.apply{|x| x * 3} # => 6
是否已经有一个标准的方法来实现这一点,或者有一个著名的库具有类似的使用方法?如果是这样的话,我不想重新发明轮子

我经常遇到这样的情况,我有一个方法,它接受一个可选块,当没有块时,我想返回一些在方法中计算的
return\u值
,但当有块时,我想返回应用于块的
return\u值
的返回值。现在,我有一系列的台词,比如:

def method ..., &pr
  ...
  pr ? pr.call(return_value) : return_value
end
但我想坚持写作

def method ..., &pr
  ...
  pr ? return_value.apply(&pr) : return_value
end
或者更好的是,对
应用的定义稍加修改

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

我猜
对象。点击
就是你要找的:

"Abc".tap do |str|
  puts str
end

我猜
对象。点击
就是你要找的:

"Abc".tap do |str|
  puts str
end
与def apply不相同;屈服于自我;结束
?-钢条

@是的。它是。我想用
self
作为接受者来实现这一效果萨瓦

这就是你的意思吗

2.instance_eval { * 3 }
# => 6
不幸的是,这不起作用
instance\u eval
简单地运行代码,就好像接收者是
self
一样。操作员不会假定自己是接收者,因此您实际上必须编写以下代码:

2.instance_eval { self * 3 }
# => 6
但是,作为概念证明,这是可能的:

Numeric.send(:define_method, :plus) { |x| self + x }
2.instance_eval { plus 3 }
# => 5
与def apply不相同;屈服于自我;结束
?-钢条

@是的。它是。我想用
self
作为接受者来实现这一效果萨瓦

这就是你的意思吗

2.instance_eval { * 3 }
# => 6
不幸的是,这不起作用
instance\u eval
简单地运行代码,就好像接收者是
self
一样。操作员不会假定自己是接收者,因此您实际上必须编写以下代码:

2.instance_eval { self * 3 }
# => 6
但是,作为概念证明,这是可能的:

Numeric.send(:define_method, :plus) { |x| self + x }
2.instance_eval { plus 3 }
# => 5
(Aftwer reading 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}"}
(Aftwer reading 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}"}


当上面列出的小函数实现了您的目标时,为什么要引入新的依赖项?@maerics如果有内置方式,我想使用它。为什么不使用lambda呢<代码>f=->(x){x*3};six=f[2]
@muistooshort实际上,这不太好。看起来你的积木放错地方了。为什么不直接返回值,让调用者做他们想做的事情呢?当上面列出的小函数实现了你的目标时,你为什么要引入一个新的依赖关系呢?@maerics如果有内置的方法,我想使用它。为什么不直接使用lambda呢<代码>f=->(x){x*3};six=f[2]
@muistooshort实际上,这不太好。看起来你的积木放错地方了。为什么不直接返回值并让调用者使用它做他们想做的事情呢?
点击
还有一个副作用,就是返回你正在点击的对象,这可能是你想要的,也可能不是你想要的(这对于将调用插入方法链很有用),但是与最初的请求略有不同,
tap
也是一种Ruby 1.9方法,如果向后兼容是一个问题,那么需要将它添加到Ruby 1.8中:Ruby 1.9-不完全是,它出现在1.8.7中。@AleksanderPohl实际上正如Gareth所写,这不是我想要的。是的,点击
和您的方法(返回值)之间有一点不同。我一开始还没有发现它。
点击
还有一个副作用,就是返回你正在点击的对象,这可能是你想要的,也可能不是你想要的(这对于将调用插入方法链很有用),但是与最初的请求略有不同,
tap
也是一种Ruby 1.9方法,如果向后兼容是一个问题,那么需要将它添加到Ruby 1.8中:Ruby 1.9-不完全是,它出现在1.8.7中。@AleksanderPohl实际上正如Gareth所写,这不是我想要的。是的,点击
和您的方法(返回值)之间有一点不同。我一开始还没发现。