gpt4 book ai didi

ruby - class_eval 和 class << className 有什么区别?

转载 作者:数据小太阳 更新时间:2023-10-29 08:15:00 26 4
gpt4 key购买 nike

我是 Ruby 初学者。我发现这两者非常相似(在输出中),但我无法理解以下上下文中的区别。比如我有一个类

class Say
def self.hello
puts "hello"
end
end

可以这样扩展

class << Say
def hi
puts "hi"
end
end

也喜欢这个

Say.class_eval do
def self.bye
puts "bye"
end
end

我应该什么时候使用 <<什么时候class_eval

最佳答案

class_evalclass << className 没有任何关系| .

A.class_eval do
...
end

相当于

class A
...
end

有一些不同。 class_eval 使用一个 block (或一个字符串,但暂时忽略它),这意味着它在包含的词法范围内关闭。换句话说,您可以使用周围范围内的局部变量。公共(public)类 block 引入了一个全新的作用域。同样,您可以创建 block 并将其传递给许多不同的 class_eval, block 的主体将在您调用 class_eval 的类的上下文中执行。

class << className打开 className 的单例类, 允许您定义类方法。

class << A
def foo
...
end
end

相同
def A.foo
...
end

请注意,如果 A 恰好是一个类(几乎),ruby 中的所有对象都有单例类,并且您可以使用这两种语法中的任何一种为它们定义方法,则它们只是类方法。 class << obj的优势|主要是如果您一次定义许多单例方法。

关于ruby - class_eval 和 class << className 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5391541/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com