여러 매개 변수를 전달하는 루비 전송 방법
객체 및 호출 메서드를 동적으로 만들려고 합니다.
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
'programing' 카테고리의 다른 글
레일 인증 토큰 이해 (0) | 2023.05.31 |
---|---|
루비의 선행 0 (0) | 2023.05.31 |
Android Studio와 Eclipse 중 어떤 Android IDE가 더 낫습니까? (0) | 2023.05.31 |
Git과 함께 프로젝트의 첫 번째 커밋을 변경하시겠습니까? (0) | 2023.05.31 |
CMD.EXE(Windows Command Interpreter)는 스크립트를 어떻게 구문 분석합니까? (0) | 2023.05.31 |