2012-06-22 2 views
0

으로 초기화에 대한 과부하 솔루션은 내 수업에서 나는 그 4 생성자와의 호환성을 유지해야합니다루비 - 내가 루비 다른 언어에서 일부 코드를 포팅하고있어 3 PARAMS

def initialize(b) 
def initialize(a, b) 
def initialize(b, c) 
def initialize(a, b, c) 

나는 그러나이 방법을 시도하고 있었다 작동하지 않습니다.

def initialize(a="", b, c="") 

스마트 솔루션이 있습니까? 나는 해시를 사용할 수 없다.

+1

'초기화 (a, b)'와 '초기화 (b, c)'의 차이점은 무엇입니까? –

+0

'a','b' 및'c'는 완전히 다른 유형입니다. –

+3

정적으로부터 동적으로 타입이 지정된 언어로 코드를 변환하면 근본적으로 어떤 것을 변경하거나 매우 추악하고 루비가 아닌 해결 방법을 구현해야합니다. –

답변

0

이것은 해결책이 될 수 있지만 추악합니다.

def initialize(*args) 
    case (args.length) 
     when 1 
      super(XXX) 
      @y = args[0] 
     when 2 
      if args[0].kind_of?(A) then 
       super(args[0]) 
       @x = args[0] 
       @y = args[1] 
      elsif args[0].kind_of?(B) then 
       super(XXX) 
       @y = args[0] 
       @z = args[1] 
      end 
     when 3 
      super(args[0]) 
      @x = args[0] 
      @y = args[1] 
      @z = args[2] 
    end 
end 
2

해시를 사용할 수없는 경우 (이유가 무엇인가요?) 이어야하며 initialize이어야합니다. 운이 좋지 않을 수 있습니다. 입력이나 위치 정보가 없으면 배열을 분해하고 어떤 인수가 어떤 것인지를 결정할 방법이 없습니다.

IMO 가장 깨끗한 것은 생성 작업을 수행하는 클래스 메소드를 제공하고 생성자 (이 경우 팩토리) 고유의 인수를 허용하는 것입니다.

인수가 다른 유형 인 경우 전달할 값을 결정할 때 해당 정보를 사용할 수는 있지만 IMO는 상당히 추악합니다. a,b,c 완전히 다른 종류이며, 항상 경우

+0

이 메소드에 대한 # 호출을 다시 작성하고 싶지 않기 때문에 해시를 사용할 수 없습니다. 나는 코드를 이식하고 있는데, 가장 쉬운 방법을 찾고있다. –

+0

인수가 다른 유형이고 나는 이것이 유일한 해결책 일 수 있다고 생각합니다. 한숨. –

2

는,이 같은 아마 뭔가 : 나는 인정한다

def initialize(*args) 
    args.each do |arg| 
     do_a if arg.is_a?(first_type) 
     do_b if arg.is_a?(second_type) 
     do_c if arg.is_a?(third_type) 
    end 
end 

, 그것은 꽤 아니지만 작동합니다. 3 개의 매개 변수 만 원하는 경우 each을 으로 제한하십시오.