qtruby,QUiLoader和respond_to?

时间:2010-04-02 19:34:12

标签: ruby qt4

我正在Ruby中编写一个简单的Qt4应用程序(使用qtruby)来教我自己。它大部分时间都很顺利,但在尝试使用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所描述的问题,但我认为在提交针对该项目的错误之前我会得到专家意见。

1 个答案:

答案 0 :(得分:1)

我只是查看了将Ruby代码映射到QT的qtruby代码,它们只使用method_missing而不实现respond_to?。因此,它与您链接的问题完全一样。我通过使用obj.is_a?(例如Qt :: Widget)来解决这个问题,这显然不是鸭子打字,但在某些情况下效果很好。