在 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>