首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >main中的Ruby2.0 define_method

main中的Ruby2.0 define_method
EN

Stack Overflow用户
提问于 2013-09-27 22:30:47
回答 2查看 797关注 0票数 4

define_methodModule的一种方法。

在Ruby2.0中,define_method可以在顶层使用;它不必在类或模块中。

代码语言:javascript
复制
define_method :kick do
  puts "method"
end

在Ruby1.9中,main对象没有define_method方法。

代码语言:javascript
复制
define_method :kick
# => NoMethodError: undefined method `define_method' for main:Object

Ruby 2.0是如何实现这一点的?

EN

回答 2

Stack Overflow用户

发布于 2014-02-04 09:47:45

我也对这个特性很好奇,并使用irb来尝试一下。请看一下:

代码语言:javascript
复制
% irb
2.0.0-p353 :001 > method(:define_method)
=> #<Method: main.define_method> 
2.0.0-p353 :002 > private_methods(false)
=> [:public, :private, :include, :using, :define_method, :irb_exit_org, :default_src_encoding, :irb_binding] 
2.0.0-p353 :003 > singleton_class.private_instance_methods(false)
=> [:public, :private, :include, :using, :define_method, :irb_exit_org] 

它表明define_method是主对象(顶层自身)的私有单例方法。

票数 2
EN

Stack Overflow用户

发布于 2014-06-26 10:00:37

define_method()建立在uncutstone的侦察基础上,不会被main的单例类继承:

代码语言:javascript
复制
class <<self
  p private_instance_methods(false)
end

--output:--
[:public, :private, :include, :using, :define_method]

...and据我所知,如果一个方法没有被继承,就必须在类中定义它。请注意,当您包含一个模块时,ruby会创建一个匿名类并在匿名类中插入模块的defs,然后在方法查找链中将匿名类直接插入到包含类的上方,例如:

代码语言:javascript
复制
module A
  def greet
    puts 'hi'
  end
end

class Dog
  include A
end

p Dog.instance_methods(false)
p Dog.instance_methods.grep(/^g/)

--output:--
[]
[:greet]

输出显示greet()是一个继承的方法。但是因为define_method()不是由main的单例类继承的,所以不能通过包含一个模块来获得define_method()。相反,define_method()似乎必须是在main的单例类中定义的。因此,实现这一点的一种方法是让ruby解释器在解析代码之前执行以下代码:

代码语言:javascript
复制
class <<self
  def define_method(x, *y)
    #same code as in Module's define method
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19053338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档