2014-07-03 52 views
0

什麼時候在方法中使用方法是一個好習慣?Ruby - 爲什麼方法中的方法不好?

這裏是方法的方法不好用例如:

class SomeClass 
    def self.fooify(a, b, c) 
    def self.bar?(a) 
     (a % 3) == 0 
    end 

    return a if self.bar?(a) 
    return b + c 
    end 
end 

加分 - 你將如何存根吧?

+1

你有看看http://stackoverflow.com/questions/4864191/is-it-possible-to-have-methods-inside-methods – Bala

+0

啊哈,沒有看到。謝謝 – xxjjnn

+0

在我看來,lambda和proc被創建爲可丟棄的一段代碼。 (a)'(或'bar.call()'),並且在if:'return a if bar。(a)'(或'bar.call()')。或者你可以這樣做:'返回一個if - >(a){(a%3)== 0}。(a)'。考慮到'self.fooify'中的'a,b,c'是本地的,你不必爲lambda指定參數,所以它可能是這樣的:'return a if - > {(a%3 )== 0)}。()'ps。這是用於存根條的答案,但我不確定我是否正確理解它。 –

回答

2

您可以使用方法定義方法中,這樣定義的內部方法時,父類的方法被稱爲:

class A 
    def self.define_foo 
    def foo 
     :foo 
    end 
    end 
end 

a = A.new 
a.foo  #=> undefined method foo 
A.define_foo 
a.foo  #=> :foo 

然而,這是相當罕見的,因爲方法定義的方式有傳遞給到PARAMS進不去家長。有用得多是使用define_method攜帶結合方法已被創建在:

class A 
    def self.define_sth(sth) 
    define_method sth do 
     sth 
    end 
    end 
end 

a = A.new 
a.bar  #=> undefined method bar 
A.define_sth(:bar) 
a.bar  #=> :bar 

定義的關聯時,這是被用於例如通過導軌。當您撥打Parent.has_one :child時,方法has_one調用define_method來創建child,child=,build_childcreate_child方法。

至於存根,創建這種方法的方法與其他方法沒有什麼不同,您只需照常存根即可。

+0

謝謝!有一個bug,define_method ......應該是define_method吧,我想。編輯失敗=( – xxjjnn

+1

@ ClothSword - 我拒絕了這個編輯,因爲這會給你'未定義的方法欄','define_method'只是一個常規方法,傳遞的參數是新方法的名稱,在這種情況下,方法名稱作爲參數傳遞給父方法。 – BroiSatse

相關問題