我有一種情況,我有一個類的方法,可以在類上根據該類是否包含一個模塊。例如:檢查包含的類方法可以不存在
class HomePage
include Symbiont
url_matches 'test'
end
class WeightPage
include Symbiont
end
這裏當包含Symbiont時,它提供了一個名爲url_matches
的類方法。但是,請注意,您不必使用它,如WeightPage所示。因此,儘管Symbiont使該方法可用,但包含Symbiont的類不必使用它。
問題出在這裏:我想要做的是檢查班級是否實際上在利用它。
但我無法弄清楚如何。所以我們可以說我這樣做:
@home = HomePage.new
@weight = WeightPage.new
我希望能夠做這樣的事情:
@home.respond_to?(:url_matches) # should return true
@weight.respond_to?(:url_matches) # should return false
這是行不通的。兩者都返回false。然後我嘗試了這個類:
@home.class.respond_to?("url_matches")
@weight.class.respond_to?("url_matches")
但是,它總是返回true。
我嘗試這樣做:
@home.class.public_instance_methods.include?(:url_matches)
@weight.class.public_instance_methods.include?(:url_matches)
始終返回false。
@home.class.method_defined?(:url_matches)
@weight.class.method_defined?(:url_matches)
總是返回false。
在這一點上,我不知道該怎麼做。
底層代碼上下文
在上下文中的代碼可能會有點難以遵循這個問題的目的,只是爲它提供:
這裏是被包含在「共生體」模塊:
https://github.com/jnyman/symbiont/blob/master/lib/symbiont.rb
請特別注意這部分:
module Symbiont
def self.included(caller)
caller.extend Symbiont::Assertion
的共生::斷言是在這裏:
https://github.com/jnyman/symbiont/blob/master/lib/symbiont/assertions.rb
也就是說在url_matches
從何而來。所以當Symbiont被包含在一個類中時,如前所示,這就是允許在類中聲明url_matches
的原因。
不知道這是一個好主意。 '@ url_match'似乎是一個實現細節,不應該泄漏到你的代碼中。 – Magnuss
@Magnuss好點,但實際上我在這裏做的邏輯是該代碼中另一個類的一部分。我沒有提到這一點,以免使事情複雜化。我正在嘗試提供的答案中提供的代碼;將會更新,如果它看起來不錯。到目前爲止,所有跡象都是肯定 –
@Magnuss:我同意你的看法,'@ url_match'是一個實現細節,在gem之外使用這個變量可能是個壞主意。但是,檢查變量似乎是目前唯一的選擇,因爲OP沒有告訴我們爲什麼他需要知道該方法是否被調用,因爲該寶石不提供另一種選擇。 – spickermann