簡體   English   中英

TkRoot塊中的標題方法在Ruby中如何工作?

[英]How does title method inside TkRoot block work in Ruby?

我知道這是一個奇怪的問題。 但是,在思考如何在TkRoot.new { title('Something') }定義名為title的方法時,我一直scratch 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內部的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。 也就是說,它可能適用於TK,RSpec或Sinatra,但是如果您認為它很酷並且想要使用它,那么請三思而后行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM