在 Ruby/Tk 中提及自己
Referring to self in Ruby/Tk
我想我对对象如何引用自身的语法有疑问,特别是在 Tk 回调中使用时。
示例代码:
class MyDialog
def initialize
@self = self
end
def makeButton
TkButton.new(myFrame) do
text "Do Cool Stuf"
command @self.buttonCallback
pack('side'=>'top')
end
end
def buttonCallback
// stuff
end
end
这看起来很好,但是当我点击按钮时,我得到一个错误提示
NoMethodError: undefined method `buttonCallback' for nil:NilClass
如何让按钮按下调用创建它的 MyDialog 实例?
这个问题与 Ruby + Tk command binding - scope issue? and the answer 类似,给了我让它发挥作用所需的线索。
def makeButton
myself = @self
TkButton.new(myFrame) do
text "Do Cool Stuf"
print "DEBUG: self=#{self} @self=#{@self} myself=#{myself}\n"
command(proc{myself.buttonCallback})
pack('side'=>'top')
end
end
作为参考,这里是调试打印的内容:
DEBUG: self=#<Tk::Button:0x3db6468> @self= myself=#<ManualEntry:0x2274690>
我想我对对象如何引用自身的语法有疑问,特别是在 Tk 回调中使用时。 示例代码:
class MyDialog
def initialize
@self = self
end
def makeButton
TkButton.new(myFrame) do
text "Do Cool Stuf"
command @self.buttonCallback
pack('side'=>'top')
end
end
def buttonCallback
// stuff
end
end
这看起来很好,但是当我点击按钮时,我得到一个错误提示
NoMethodError: undefined method `buttonCallback' for nil:NilClass
如何让按钮按下调用创建它的 MyDialog 实例?
这个问题与 Ruby + Tk command binding - scope issue? and the answer 类似,给了我让它发挥作用所需的线索。
def makeButton
myself = @self
TkButton.new(myFrame) do
text "Do Cool Stuf"
print "DEBUG: self=#{self} @self=#{@self} myself=#{myself}\n"
command(proc{myself.buttonCallback})
pack('side'=>'top')
end
end
作为参考,这里是调试打印的内容:
DEBUG: self=#<Tk::Button:0x3db6468> @self= myself=#<ManualEntry:0x2274690>