首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby语言中的ScopeGates

Ruby语言中的ScopeGates
EN

Stack Overflow用户
提问于 2010-08-11 11:35:37
回答 1查看 329关注 0票数 1

我正在读Ruby中的Metaprogramming一书。在那本书中,当我阅读有关范围门的内容时,显示了以下代码

代码语言:javascript
复制
my_var = "Success"

MyClass = Class.new do
  puts "#{my_var} in the class definition"

  define_method :my_method do
    puts "#{my_var} in the method"
  end
end

MyClass.new.my_method

=>Success in the class definition
  Success in the method

现在,当我在下面的代码中执行时,我得到一个错误消息: undefined method my_method MyClass.new MyClass:0x00000100936a30

代码语言:javascript
复制
MyClass.my_method
NoMethodError: undefined method `my_method' for MyClass:Class
from (irb):11
from /usr/local/bin/irb:12:in `<main>'

当my_method被称为MyClass.new.my_method而不是MyClass.my_method时,为什么要创建它?

EN

回答 1

Stack Overflow用户

发布于 2010-08-11 12:04:22

define_method方法将实例方法添加到类中。当您在匿名类中调用define_method时,您的方法将被添加为实例方法。要将其添加为类方法,必须将其添加到元类中。

最简单的方法是使用class << self语法。

代码语言:javascript
复制
MyClass = Class.new do
  class << self
    define_method(:my_method) do
      puts "class method"
    end
  end
end

MyClass.my_method # => "class method"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3455101

复制
相关文章

相似问题

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