2017-09-09 3 views
-1

임의의 개체 형식에서 메서드를 호출하려고하는 유틸리티 라이브러리를 작성하려고합니다. 유형으로 우리가 알 수없는 그래서 Can't infer the type of instance variable 'object'의 컴파일러 오류가 나는 크리스탈에서이 작업을 수행하는 방법을 잘 모르겠어요알 수없는 형식의 메서드 인수

def foo(object) 
    object.public_send(:bar) 
rescue NoMethodError 
    raise "Method not defined on object" 
end 

foo(instance_of_my_arbitrary_class) 

: 루비에서, 내가 좋아하는 일을 할 것입니다.

전달할 객체의 유형을 알지 못하면 어떻게해야합니까?

+0

추상 수업을 만드시겠습니까? –

+1

@ MarkThomas 어쩌면? 그냥 배우면서 추상 수업을 들여다 보겠습니다. –

+0

이것은 Crystal의 [알려진 제한 사항] (https://github.com/crystal-lang/crystal/issues/2733)입니다. 아마도 [Generics] (https://crystal-lang.org/docs/syntax_and_semantics/generics.html) –

답변

1

나는 모듈을 사용하고 그것을 포함하여 이것을 알아 냈다고 생각한다.

1

Crystal에서는 메서드가 런타임이 아닌 컴파일 타임에 해결되므로 임의의 개체에 임의의 메서드를 호출 할 수 없습니다. MyObj의 인스턴스 방법 bar이 있기 때문에, 여기에

def foo(object) 
    object.bar 
end 

class MyObj 
    def bar 
    puts "bar!" 
    end 
end 

foo(MyObj.new) # => "bar!" 

작동 : 사용자가 호환되지 않는 타입 라이브러리 방법을 사용하려고하면 그는 컴파일 타임 오류가 발생합니다. 그 방법이없는 것을 사용한다면, 사용자는 컴파일시 오류가 발생합니다 :

foo(3) # compile error: undefined method 'bar' for Int32 

이 오류는 프로그램 실행 전에 showned됩니다.

관련 문제