gpt4 book ai didi

ruby - 引入关键字 "singleton_class"是否会破坏 Ruby 代码或导致其他困难?

转载 作者:太空宇宙 更新时间:2023-11-03 16:13:19 26 4
gpt4 key购买 nike

假设有人希望创建一个具有类实例变量、该变量的 getter、类方法和实例方法的类。人们可能会写下以下内容。

class C
@v = 1

def hi
'hi'
end

class << self
attr_reader :v

def ho
'ho'
end
end
end

C.methods(false)
#=> [:v, :ho]
C.ho
#=> "ho"
C.v
#=> 1

当然,这可以写成许多其他方式。例如:

class C
@v = 1

def hi
'hi'
end

def self.ho
'ho'
end

singleton_class.class_eval do
attr_reader :v
end
end

C.methods(false)
#=> [:v, :ho]
C.ho
#=> "ho"
C.v
#=> 1

在这两种情况下,class << selfsingleton_class.class_eval原因selfC 更改至 C.singleton_class .假设有一个关键字 singleton_class做同样的事情,允许我们编写以下内容。

class C
@v = 1

def hi
'hi'
end

singleton_class

attr_reader :v

def ho
'ho'
end
end

C.methods(false)
#=> [:v, :ho]
C.ho
#=> "ho"
C.v
#=> 1

可以有另一个关键字允许 selfC 之间来回翻转及其单例类,但在 singleton_class 之后要求所有内容可能是最简单的与单例类有关。

使用关键字 singleton_class 之间似乎不会出现冲突。和同名的局部变量或方法。例如,考虑使用关键字 private :(在写完以下内容后,我了解到我长期以来认为 private 是一个关键字是不正确的;它是不带参数使用的方法 Module#private。我将其留在此处,因为它在评论中被引用。)

class C
def m
private = 'hi'
private
end
private :m

private
def private
'ho'
end
end
c = C.new
c.m
#=> NoMethodError (private method `m' called...
c.send :m
#=> "hi"
c.private
#=> NoMethodError (private method `private' called...
c.send :private
#=> "ho"

我的问题在标题中给出了。也请随意就 Ruby 是否会从引入以这种方式使用的关键字中获益提出意见。

最佳答案

是的。引入新关键字总是会破坏现有代码。

以前,无论你引入什么都是一个有效的标识符,现在不是了。

这就是为什么关键字非常“昂贵”并且应该非常谨慎地使用。 (Ruby 已经有太多了,IMO)。

关于ruby - 引入关键字 "singleton_class"是否会破坏 Ruby 代码或导致其他困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54497712/

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