2012-03-06 64 views
0

我想要在Object上定義一個方法,它需要一個塊並將接收器應用於該塊。的實現將是這樣的:將自己應用於proc的方法

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 
+1

你爲什麼要引入一個新的依賴時,上面列出的小功能能實現你的目標是什麼? – maerics 2012-03-06 20:16:08

+0

@maerics如果有內置的方式,我想使用它。 – sawa 2012-03-06 20:17:05

+2

爲什麼不使用lambda? 'f = - >(x){x * 3};六= f [2]' – 2012-03-06 20:41:29

回答

3

我猜Object.tap是你在找什麼:

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

'tap'還具有返回其可以或可以不被期望的(它是用於插入到呼叫方法鏈有用)你輕敲對象,的副作用,但是從原來的請求 – Gareth 2012-03-06 20:20:31

+0

略有不同'tap'也一個Ruby 1.9的方法和需要是猴子打補丁到Ruby 1.8中,如果向後兼容性是一個問題 – Gareth 2012-03-06 20:22:19

+0

@Gareth是正確的。其實,「tap」並不是我想要的。 – sawa 2012-03-06 20:22:39

1

def apply; yield self; end不一樣嗎? - steenslag

@steenslag是的。它是。我想用self作爲接收器。 - sawa

這是你的意思嗎?

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 
0

(Aftwer閱讀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}"}