source

루비 전송 vs __send__

factcode 2023. 6. 13. 22:50
반응형

루비 전송 vs __send__

는 의개념이해다니합의 합니다.some_instance.send일을 하는 것 을 암시합니다.루비 코안은 같은 일을 하는 데 많은 다른 방법을 제공하는 것 이상의 어떤 이유가 있다고 암시합니다.다음은 두 가지 사용 예입니다.

class Foo
  def bar?
    true
  end
end

foo = Foo.new
foo.send(:bar?)
foo.__send__(:bar?)

이 일에 대해 아는 사람?

클래스: 표준 라이브러리의 클래스으로 정의합니다.send 방법한관과 .Object#send그래서 만약 당신이 어떤 클래스의 객체로 작업을 하고 싶다면, 당신은 사용해야 합니다.__send__안전한 편에 설 수 있습니다.

이제 질문을 남깁니다, 왜 거기에send 만아라니가 .__send__만약 그것이 있었다면.__send__라는 send다른 클래스에서 혼동 없이 사용할 수 있습니다.는 그이는 때문입니다.send처음에 존재했고 나중에야 그 이름이 실현되었습니다.send또한 다른 맥락에서 유용하게 사용될 수도 있습니다.__send__추가되었습니다(그것은 에서 발생한 것과 동일한 일입니다.id그리고.object_id그건 그렇고)

정말 필요하다면,send평처럼행면려동하은, 사합다니야용해당신소합다▁use니▁to사를 사용해야 합니다.__send__오버라이드 되지 않기 때문입니다.용사를 합니다.__send__조작 중인 클래스가 정의하는 메서드를 모를 때 메타프로그래밍에서 특히 유용합니다.오버라이드 했을 수도 있어요send.

보기:

class Foo
  def bar?
    true
  end

  def send(*args)
    false
  end
end

foo = Foo.new
foo.send(:bar?)
# => false
foo.__send__(:bar?)
# => true

오버라이드하는 경우__send__Ruby에서 다음 경고가 발생합니다.

경고: '__send_'를 재정의하면 심각한 문제가 발생할 수 있습니다.

오버라이드하는 것이 유용한 경우send메시지 전달, 소켓 클래스 등과 같이 해당 이름이 적절한 위치에 있을 것입니다.

__send__실수로 덮어쓸 수 없도록 존재합니다.

이유에 대해서는 이유에 대하여send例재:사람을 할 수는 다른사대수없는지만할변을람존,없만지수▁but는▁else,▁i,object.send(:method_name, *parameters)보다 더 멋져 보입니다.object.__send__(:method_name, *parameters)그래서 저는 사용합니다.send사용할 필요가 없는 한__send__.

다른 사람들이 이미 당신에게 말한 것을 제외하고, 그리고 무엇이 그렇게 말하는 것으로 귀결되는지를 제외하고.send그리고.__send__동일한 방법의 두 별칭입니다. 세 번째에 관심이 있을 수 있습니다. 다소 다른 가능성, 즉public_send예:

A, B, C = Module.new, Module.new, Module.new
B.include A #=> error -- private method
B.send :include, A #=> bypasses the method's privacy
C.public_send :include, A #=> does not bypass privacy

2, Ruby 2.1 이후,Module#include그리고.Module#extend메서드가 공개되므로 위의 예제는 더 이상 작동하지 않습니다.

send의 전송간주차이은점요의,은▁send,▁between▁the,__send__는 followpublic_send와 .

  1. 와 보내기__send__하는 데 된 것과 하지만, 주요 은 경고 할 수 , 를 재정의할 는 Object의 메서드를 재정의할 수 있다는 입니다.__send__그러면 경고 메시지가 표시됩니다.

경고: 재정의__send__심각한 문제를 일으킬 수 있음

수 때 충돌을 위해 이는충피하위해기, 특히보라리에서다사이러브니사알항합용수용경컨나없이상석텍는할우를트스돌을▁use▁this▁when다▁always,▁or니사합▁to항을 사용해야 하기 때문입니다.__send__보내는 대신에

  1. 전간의차또이는송또(rence)의 __send__send / ) 및 public_send 송전는 /__send__개체의 개인 메서드를 호출할 수 있지만 public_send는 호출할 수 없습니다.
class Foo
   def __send__(*args, &block)
       "__send__"
   end
   def send(*args)
     "send"
   end
   def bar
       "bar"
   end
   private
   def private_bar
     "private_bar"
   end
end

Foo.new.bar #=> "bar"
Foo.new.private_bar #=> NoMethodError(private method 'private_bar' called for #Foo)

Foo.new.send(:bar) #=> "send"
Foo.new.__send__(:bar) #=> "__send__"
Foo.new.public_send(:bar) #=> "bar"

Foo.new.send(:private_bar) #=> "send"
Foo.new.__send__(:private_bar) #=> "__send__"
Foo.new.public_send(:private_bar) #=> NoMethodError(private method 'private_bar' called for #Foo)

마지막에 __send_ 또는 send를 사용하는 대신 public_send를 사용하여 개인 메서드에 직접 호출하지 않도록 합니다.

언급URL : https://stackoverflow.com/questions/4658269/ruby-send-vs-send

반응형