2009-08-26 4 views
3

Ruby 함수에 전달 된 기본 인수를 변경하고 싶습니다. 예를 들어, 대신 각 시간은 내가기본 Ruby 인수 변경

[1,2,3].do_stuff 

을 쓸 수 있도록 기본 매개 변수를 변경하는 간단하고 깨끗한, 대부분의 루비 같은 방법은 무엇 기본값을 수정할

[1,2,3].do_stuff(:option => ' my option ') 

를 작성 ?

답변

2
>> [1, 2, 3].do_stuff 
=> Result I get 
>> [1, 2, 3].do_stuff :an_option => a_value 
=> Result I really want, but don't want to specify the argument 

나는 이것을 위해 super을 사용하고 싶습니다. 그것은 우리가 단지 변경 기본 인수에서 떨어져 방법에 몇 가지 기능을 추가 할 수 있습니다 :

class Array 
    def do_stuff(options = {}) 
    # Verify if caller has not passed the option 
    options[:argument_i_want_to_change] = default_value_i_want unless options.has_key? :argument_i_want_to_change 
    # call super 
    super 
    end 
end 

결과 :

>> [1, 2, 3].do_stuff 
=> Result that I really want 

UPDATE : 제거 된 reverse_merge! 의존. (이제 [] = 메소드 사용에 대한 더 나은 대안을 찾으십시오)

0

직접 작성하지 않은 코드에 대한 솔루션을 원하십니까? 내가 알고있는 두 가지 옵션이 있습니다.

코드 당신이 자신을 썼다 :

def some_method_you_wrote(options) 

이된다 :

def some_method_you_wrote(options = { :option1 => 'value' }) 

는, 쓰기 앨리어싱 방법으로 보이지 않았다 코드에 대한

(Swanand의 대답은 너무 좋다). (레일,이 목적을 위해 IIRC라는 것을 alias_method_chain을 제공합니다.)

+0

이 접근 방식의 문제점은 'option1'키 집합을 사용하지 않고 옵션의 해시를 전달할 경우 'option1'옵션이 설정되지 않는다는 것입니다. – Benjamin

1

(원래의 질문에서 이동)

난 당신이 이미 존재하는 방법 배열 #의 do_stuff에 대해 얘기하는 가정,하지만 당신은 약간을 수정하려면 (기본 매개 변수를 변경하여 귀하의 경우).

게시물 here은 좋은 방법입니다. 별칭 기술과 동일한 문제가 발생하지 않습니다. 남은 "오래된"방법이 없기 때문입니다. 당신이 당신의 예제 문제와 그 기술을 사용할 수있는 방법은 다음과

또한 위의 코드가 혼란 경우 UnboundMethod에 읽을 수도 있습니다

class Array 
    old_do_stuff = instance_method(:do_stuff) 
    define_method(:do_stuff) { |options = {}| 

    options[:option] ||= " option " 
    old_do_stuff.bind(self).call(options) 
    } 
end 

(루비 1.9 테스트). old_do_stuff는 end 문 다음에 범위를 벗어나므로 나중에 Array를 사용하는 경우에는 문제가되지 않습니다.