如何动态定义一个类方法来引用外部的局部变量?

发布于 2024-09-14 13:42:24 字数 274 浏览 8 评论 0原文

class C
end

var = "I am a local var outside"

C.class_eval do
   def self.a_class_method
     puts var 
   end
end

我知道,这是不正确的,因为 def 创建了一个新的作用域。 我也知道使用define_method可以创建实例方法而无需创建新的作用域,但我的观点是如何定义类方法

class C
end

var = "I am a local var outside"

C.class_eval do
   def self.a_class_method
     puts var 
   end
end

I know, this is not correct, because the def created a new scope.
I also know that use define_method can create a instance method without creating a new scope, but my point is how to define a class method.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

拍不死你 2024-09-21 13:42:24

Ruby 中并不真正存在类方法,它们只是类对象的单例方法。单例方法也不真正存在,它们只是对象单例类的普通实例方法。

由于您已经知道如何定义实例方法(使用 Module#define_method),因此您已经知道需要了解的所有内容。您只需要在 C 的单例类上调用 class_eval 而不是 C 本身:

(class << C; self end).class_eval do
  define_method(:a_class_method) do
    puts var 
  end
end

当前版本的 Ruby 有一个 singleton_class 方法使这变得更容易:

C.singleton_class.class_eval do
  define_method(:a_class_method) do
    puts var 
  end
end

但实际上,当前版本的 Ruby 也有 Module#define_singleton_method,因此,在这种特殊情况下,这是不必要的:

C.define_singleton_method(:a_class_method) do
  puts var 
end

Class methods don't really exist in Ruby, they are just singleton methods of the class object. Singleton methods don't really exist, either, they are just ordinary instance methods of the object's singleton class.

Since you already know how to define instance methods (using Module#define_method), you already know everything you need to know. You just need to call class_eval on C's singleton class instead of C itself:

(class << C; self end).class_eval do
  define_method(:a_class_method) do
    puts var 
  end
end

Current versions of Ruby have a singleton_class method to make that easier:

C.singleton_class.class_eval do
  define_method(:a_class_method) do
    puts var 
  end
end

But actually, current versions of Ruby also have Module#define_singleton_method, so, in this particular case, that is unnecessary:

C.define_singleton_method(:a_class_method) do
  puts var 
end
段念尘 2024-09-21 13:42:24

你可以简单地这样做

class << C
  define_method(:a_class_method) do
     # do something
  end
end

you can do it simply this way

class << C
  define_method(:a_class_method) do
     # do something
  end
end
南薇 2024-09-21 13:42:24
C.instance_eval do
  def class_method
    "This is class method"
  end
end

instance_eval:定义对象上的单例方法(在类对象上调用时会生成类方法)。

class_eval:定义常规实例方法

C.instance_eval do
  def class_method
    "This is class method"
  end
end

instance_eval: defines singleton methods on the object (which results in class methods when it's called on class object).

class_eval: defines regular instance methods

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文