在Ruby中,可以通过重新打开来访问对象的本征类(或“单例类”)。这对于定义“私有类方法”特别有用:
class Foo
class << self
private
def declarative_method_name
end
end
declarative_method_name
end
# Foo.declarative_method_name => ERROR!
但是,在Crystal中,这不是语法:
Syntax error in ./test.cr:2: expecting token 'CONST', not '<<'
class << self
^
目前还有另一种(或实际上是否有)在Crystal中实现此目的的方法吗?
答案 0 :(得分:5)
目前在Ruby中没有本征类,或者更常见的称为单例类(在那里给出了Object#singleton_class
),在Crystal中。
但是,支持定义类方法并在类级别调用它们:
class Foo
private def self.declarative_method_name
puts "hey"
end
declarative_method_name
end
这里的def self.
构造是由编译器专门设计的,并且它下面没有更一般的概念。
答案 1 :(得分:0)
如何将超类的新方法设为私有,同时仍允许其子类'公开?
class Foo
private self.new; end
end
class Bar < Foo
end
Bar.new #=> error: private method 'new' called for Foo:Class
答案 2 :(得分:0)
这里还值得注意的是,与 Ruby 不同的是,类变量不超越继承。在 Ruby 中,以下代码有一个奇怪的副作用...
class Foo
@@var = 'foo'
def var
@@var
end
end
class Bar < Foo
@@var = 'bar'
end
puts Foo.new.var
尽管我们修改了 Bar 上的类变量,它还是会返回 'bar'。在 Crystal 中它返回 'foo' 意味着我们访问 eiganclass 的另一个原因,为了安全地存储和读取类级别的状态,在 Crystal 中不是必需的,我们可以只使用类变量。