source

루비에서 send()는 무엇을 합니까?

itover 2023. 6. 6. 10:58
반응형

루비에서 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>"

Object 클래스에서 라이브를 보냅니다.

이것의 이점은 무엇입니까?

이 방법의 이점은 호출할 메서드를 매개 변수로 전달할 수 있다는 것입니다.다음은 간단한 예입니다.

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

반응형