[英]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
,其中self
是Dog
。
有種流傳認為instance_eval
是有害的 。 我同意最好將它的使用限制為明確划定的DSL。 也就是說,它可能適用於TK,RSpec或Sinatra,但是如果您認為它很酷並且想要使用它,那么請三思而后行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.