Ruby的respond_to?方法不起作用 - 方法存在但返回false

时间:2013-06-06 00:34:24

标签: ruby-on-rails ruby

我使用的是Rails 3.2,Ruby 1.9.3和ThinkingSphinx(最新版本)。

此代码在Ruby 1.8.7 / Rails 2.3上运行正常,但由于我已升级到上面的代码,因此无效。

ads = Ad.search "ipod"

ads.respond_to?(:total_entries)

puts ads.total_entries #outputs 472

特别是

  

ads.respond_to?(:total_entries)

返回false,但是当我在ads对象上调用此方法时,它可以正常工作。

谁能看到这里发生了什么?

2 个答案:

答案 0 :(得分:2)

这可以是动态方法或鬼方法 如果

ads.respond_to?(:total_entries) # => false
ads.total_entries
ads.respond_to?(:total_entries) # => true

这意味着在某个地方(可能在method_missing中)total_entries已动态创建,如:

define_method :total_entries do 
  #do some stuff here
end

或如果

ads.respond_to?(:total_entries) # => false
ads.total_entries
ads.respond_to?(:total_entries) # => false

然后method_missing刚用方法名称作为参数处理它,并做了你想要的。

答案 1 :(得分:1)

即使ads.total_entries无效也意味着存在放置total_entries方法。

当你调用一个不存在的方法时,Ruby会调用method_missing处理程序来处理你的调用。

要查找确切原因,请提供Ad.search返回的类的定义。