2016-07-04 3 views
1

В Ruby можно получить доступ к элементу (или «одинарному классу») объекта, повторно открыв его. Это особенно полезно для определения «методов частного класса»:Как получить доступ к элементу объекта объекта в Crystal?

class Foo 
    class << self 
    private 
    def declarative_method_name 
    end 
    end 

    declarative_method_name 
end 

# Foo.declarative_method_name => ERROR! 

Однако в кристалле это не синтаксис:

Syntax error in ./test.cr:2: expecting token 'CONST', not '<<' 

    class << self 
     ^

Есть еще один (или даже есть) способ достижения этой цели в кристалле в настоящее время ?

ответ

5

В настоящее время в Ruby нет eigenclass, или более часто называемого классом Singleton в Ruby (данный номер Object#singleton_class), в Crystal.

Однако определение методов класса и вызова их на уровне класса поддерживается:

class Foo 
    private def self.declarative_method_name 
    puts "hey" 
    end 

    declarative_method_name 
end 

https://carc.in/#/r/1316

def self. конструкт здесь специализируется компилятором, и нет более общей концепции под ним, пока.

+0

спасибо, это имеет смысл :) – andrewdotnich

0

Как вы могли бы сделать новый класс суперкласса «приватным», все еще позволяя публиковать его подклассы?

class Foo 
    private self.new; end 
end 
class Bar < Foo 
end 
Bar.new #=> error: private method 'new' called for Foo:Class 
+0

Ну, неважно. Кристалл делает что-то странное. По-видимому, вам просто нужно добавить 'super' в метод Foo' self.new'. – trans