루비에서 send()는 무엇을 합니까?
누가 다음 스니펫이 무엇인지 말해줄 수 있습니까?
obj.send("#{method_name}")
그리고 있습니까?
send어떤 메서드가 반응할 때까지(이름이 첫 번째 인수와 일치하므로) 클래스 계층의 개체 인스턴스 및 해당 상위 인스턴스에 메시지를 보냅니다.
실질적으로, 이 선들은 다음과 같습니다.
1.send '+', 2
1.+(2)
1 + 2
참고:send에서는 가시성 검사를 생략하므로 개인 메서드도 호출할 수 있습니다(단위 테스트용으로 사용됨).
보내기 전에 변수가 없으면 글로벌 개체가 사용됩니다.
send :to_s # "main"
send :class # Object
send는 지정된 인수를 전달하는 이름으로 다른 메서드를 호출할 수 있는 Ruby 메서드입니다.
class Klass
def hello(*args)
"Hello " + args.join(' ')
end
end
k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
.send 메서드의 가장 유용한 기능 중 하나는 동적으로 메서드를 호출할 수 있다는 것입니다.이렇게 하면 타이핑 작업을 많이 줄일 수 있습니다..send 메서드의 가장 일반적인 사용 중 하나는 속성을 동적으로 할당하는 것입니다.예:
class Car
attr_accessor :make, :model, :year
end
정기적으로 속성을 할당하려면 다음과 같이 해야 합니다.
c = Car.new
c.make="Honda"
c.model="CRV"
c.year="2014"
또는 .send 메서드 사용:
c.send("make=", "Honda")
c.send("model=", "CRV")
c.send("year=","2014")
그러나 다음 항목으로 모두 대체할 수 있습니다.
레일즈 앱이 사용자 입력으로부터 차량 클래스에 속성을 할당해야 한다고 가정하면 다음과 같은 작업을 수행할 수 있습니다.
c = Car.new()
params.each do |key, value|
c.send("#{key}=", value)
end
Antonio Jha의 https://stackoverflow.com/a/26193804/1897857 과 유사한 또 다른 예입니다.
개체의 속성을 읽어야 하는 경우입니다.
예를 들어 문자열 배열이 있는 경우 문자열을 반복하여 개체에 대해 호출하면 문자열이 작동하지 않습니다.
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.a
end
# => NoMethodError: undefined method `a'
하지만, 당신은 할 수 있습니다.send개체에 대한 문자열:
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.send(a)
end
# => Vandalay Project
# => A very important project
전송은 무엇을 합니까?
send는 "메소드를 정의"하는 또 다른 방법입니다.예:
o = Object.new
o.to_s # => "#<Object:0x00005614d7a24fa3>"
# is equivalent to:
o.send(:to_s) # => "#<Object:0x00005614d7a24fa3>"
이것의 이점은 무엇입니까?
이 방법의 이점은 호출할 메서드를 매개 변수로 전달할 수 있다는 것입니다.다음은 간단한 예입니다.
def dynamically_call_a_method(method_name)
o = Object.new
o.send method_name
end
dynamically_call_a_method(:to_s) # => "#<Object:0x00005614d7a24fa3>"
호출할 메서드를 전달할 수 있습니다.이 경우에 우리는 전달했습니다.:to_s이것은 루비 메타프로그래밍을 할 때 매우 유용할 수 있습니다. 왜냐하면 이것은 우리가 다른 요구사항에 따라 다른 방법을 호출할 수 있기 때문입니다.
Send는 또한 Ruby의 모든 것이 어떻게 객체인지 보여주는 방법으로 사용될 수 있습니다.
1.send(:+, 1) ## -> 2
3.send(:*, 2) ## -> 6
보기의 다른 사용 사례:
<%= link_to
send("first_part_of_path_#{some_dynamic_parameters}_end_path",
attr1, attr2), ....
%>
모든 종류의 객체를 사용하는 확장 가능한 뷰를 작성할 수 있습니다.
render 'your_view_path', object: "my_object"
저는 그 주제에 꽤 늦었습니다.초보자로서 저는 그저 그것을 사용했고 솔직한 대답을 원하는 저와 같은 사람들에게 도움이 되고 싶었습니다.filter_message.each{|k,v| order_contal_message[send(send(send_name,k))] = v}
위에서 본 것처럼 send(send_name)가 메서드이며, 이 메서드를 호출합니다.메서드 이름이 매개 변수에서 문자열로 전달되고 k가 메서드에서 전달할 인수인 경우 이름과 일치하고 메서드를 호출합니다.
언급URL : https://stackoverflow.com/questions/3337285/what-does-send-do-in-ruby
'source' 카테고리의 다른 글
| 이전 행의 값을 기준으로 MariaDB에서 새 값 계산 (0) | 2023.06.06 |
|---|---|
| C로 퍼센트 기호(%)를 인쇄하려면 어떻게 해야 합니까? (0) | 2023.06.06 |
| __init_.py를 사용하여 전역 변수를 정의할 수 있습니까? (0) | 2023.06.06 |
| com.google 클래스를 찾을 수 없습니다.화력 기지파이어베이스InitProvider"? (0) | 2023.06.06 |
| Firebase Analytics 디버그 보기에 아무것도 표시되지 않음 (0) | 2023.06.06 |