programing

여러 매개 변수를 전달하는 루비 전송 방법

closeapi 2023. 5. 31. 15:56
반응형

여러 매개 변수를 전달하는 루비 전송 방법

객체 및 호출 메서드를 동적으로 만들려고 합니다.

Object.const_get(class_name).new.send(method_name,parameters_array)

다음과 같은 경우에 잘 작동합니다.

Object.const_get(RandomClass).new.send(i_take_arguments,[10.0])

하지만 1과 2의 주장의 수를 잘못 던집니다.

Object.const_get(RandomClass).new.send(i_take_multiple_arguments,[25.0,26.0])

정의된 랜덤 클래스는 다음과 같습니다.

class RandomClass
def i_am_method_one
    puts "I am method 1"
end
def i_take_arguments(a)
    puts "the argument passed is #{a}"
end
def i_take_multiple_arguments(b,c)
    puts "the arguments passed are #{b} and #{c}"
end
    end

루비 메서드에 여러 매개 변수를 동적으로 보내는 방법을 누가 도와줄 수 있습니까?

send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator

또는

send(:i_take_multiple_arguments, 25.0, 26.0)

다른 방법으로 전화할 수 있습니다.send동의어로__send__:

r = RandomClass.new
r.__send__(:i_take_multiple_arguments, 'a_param', 'b_param')

참고로* 해시는 다음과 같이 쉼표로 구분하여 전달할 수 있습니다.

imaginary_object.__send__(:find, :city => "city100")

또는 새 해시 구문:

imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])

블랙에 따르면,__send__네임스페이스가 더 안전합니다.

"전자 메일을 보내고, 데이터를 I/O 소켓으로 전송하는 등 광범위한 개념입니다.프로그램에서 Ruby의 기본 제공 전송 방법과 충돌하는 전송 방법을 정의하는 것은 드문 일이 아닙니다.따라서 Ruby는 전송을 호출할 수 있는 다른 방법을 제공합니다.__send__관례상 아무도 그 이름으로 메소드를 작성하지 않으므로 내장된 Ruby 버전은 항상 사용 가능하며 새로 작성된 메소드와 충돌하지 않습니다.이상하게 보이지만 메소드-이름 충돌의 관점에서 일반 송신 버전보다 안전합니다."

블랙은 또한 전화를 포장할 것을 제안합니다.__send__if respond_to?(method_name).

if r.respond_to?(method_name)
    puts r.__send__(method_name)
else
    puts "#{r.to_s} doesn't respond to #{method_name}"
end

참고: 블랙, 데이비드 A.근거가 확실한 루비스트.매닝, 2009.171쪽

*에 대한 해시 구문을 찾으러 왔습니다.__send__그래서 다른 구글 사용자들에게 유용할 수 있습니다.;)

언급URL : https://stackoverflow.com/questions/13795627/ruby-send-method-passing-multiple-parameters

반응형