Tkroot块中的标题方法如何在Ruby中起作用



我知道这是一个奇怪的问题。但是,当我想到如何在TkRoot.new { title('Something') }

中定义了一种称为标题的方法时,我一直在挠头。

好的,这是示例代码:

#!/usr/bin/ruby
require 'tk'
p defined?(title)    # => nil
root = TkRoot.new { p defined?(title) } # writes "method" to stdout.

这是官方指南的链接

我已经研究了源代码,这似乎非常凌乱(也许充满了所有不良做法,以使代码更难阅读(,并在所有警告打开时都充满了警告。

我的问题是方法定义仅在块内部工作?我可以在这里获取一个小样本代码,该代码显示如何仅将方法定义限制为块?

这种黑魔法的关键是instance_eval,它将在其接收器的上下文中评估块。通常,块内的self将由范围确定;instance_eval将在其块内更改self,为收到的instance_eval消息。

class Dog
  def bark
    puts "Woof"
  end
  def initialize(&block)
    instance_eval(&block)
  end
end
Dog.new { bark }
# => "Woof"

在这种情况下,instance_eval(&block)self.instance_eval(&block)相同,这意味着块内的self将是Dog实例;那么bark当然是self.bark,其中selfDog

有一个思想流派instance_eval是有害的。我同意最好将其用途限制为清晰划定的DSL。IE。它可能适用于TK,RSPEC或Sinatra,但是如果您认为它很酷并且想使用它,那么三思而后行。

最新更新