在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中没有特征类,或者现在Ruby中更常见的称为单例类(考虑到有Object#singleton_class
)。
然而,定义类方法并在类级别调用它们是受支持的:
class Foo
private def self.declarative_method_name
puts "hey"
end
declarative_method_name
end
https://carc.in//r/1316
这里的def self.
结构是由编译器专门指定的,在它下面还没有更一般的概念。
如何使一个超类的新方法私有,同时仍然允许它的子类是公共的?
class Foo
private self.new; end
end
class Bar < Foo
end
Bar.new #=> error: private method 'new' called for Foo:Class
这里还值得注意的是,与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中是不必要的,我们可以使用类变量。