我正在用Ruby语言(使用qtruby)编写一个简单的Qt4应用程序来自学这两种方法。在大多数情况下,它运行得很好,但在尝试使用Ruby的“鸭子类型”时,我遇到了一个障碍;respond_to?似乎不能反映现实。
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'Qt4'
=> true
irb(main):003:0> require 'qtuitools'
=> true
irb(main):004:0> Qt::Application.new(ARGV)
=> #<Qt::Application:0xc3c9a08 objectName="ruby">
irb(main):005:0> file = Qt::File.new("dlg.ui") { open(Qt::File::ReadOnly) }
=> #<Qt::File:0xc2e1748 objectName="">
irb(main):006:0> obj = Qt::UiLoader.new().load(file, nil)
=> #<Qt::Dialog:0xc2bf650 objectName="dlg", x=0, y=0, width=283, height=244>
irb(main):007:0> obj.respond_to?('children')
=> false
irb(main):008:0> obj.respond_to?(:children)
=> false
irb(main):009:0> obj.children
=> [#<Qt::FormInternal::TranslationWatcher:0xc2a1980 objectName="">, ... 正如您所看到的,当我检查以确保从加载UI文件返回的对象具有children访问器时,我得到的是false。但是,如果调用访问器,我会得到一个数组而不是NoMethodError。
那么,这是一个错误,还是我错误地理解了respond_to??
这看起来像here描述的问题,但我认为在对项目提出错误之前,我应该得到专家的意见。
发布于 2010-09-24 02:49:23
我刚刚查看了将Ruby代码映射到QT的qtruby代码,它们只使用method_missing而不实现respond_to?因此,它与您链接的问题完全相同。我通过使用obj.is_a(Qt::Widget)(例如)解决了这个问题,它显然不是鸭子类型,但在某些情况下工作得很好。
https://stackoverflow.com/questions/2568762
复制相似问题