루비 전송 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와 .
- 와 보내기
__send__
하는 데 된 것과 하지만, 주요 은 경고 할 수 , 를 재정의할 는 Object의 메서드를 재정의할 수 있다는 입니다.__send__
그러면 경고 메시지가 표시됩니다.
경고: 재정의
__send__
심각한 문제를 일으킬 수 있음
수 때 충돌을 위해 이는충피하위해기, 특히보라리에서다사이러브니사알항합용수용경컨나없이상석텍는할우를트스돌을▁use▁this▁when다▁always,▁or니사합▁to항을 사용해야 하기 때문입니다.__send__
보내는 대신에
- 전간의차또이는송또(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
'source' 카테고리의 다른 글
Linux에서 pid_t, uid_t, gid_t의 크기 (0) | 2023.06.13 |
---|---|
대형 R 프로그램을 어떻게 구성합니까? (0) | 2023.06.13 |
data.table이 다른 data.table에 대한 참조(복사본)일 때 정확하게 이해 (0) | 2023.06.13 |
Firebase Auth ID 토큰에 잘못된 "aud" 클레임이 있습니다. (0) | 2023.06.13 |
UIPageViewController에서 프로그래밍 방식으로 페이지를 넘길 수 있습니까? (0) | 2023.06.13 |