>

send는 인수와 함께 문자열이나 기호를 사용하지만 instance_eval은 문자열이나 블록을 사용하며 수신자에게 차이가 있음을 알고 있습니다.

제 질문은 '비하인드'의 차이점이 아래 예와 어떻게 다릅니 까?

1234.send 'to_s'               # '1234'
1234.instance_eval 'to_s'      # '1234'


  • 답변 # 1

    좋은 매뉴얼에서 :

    와이즈 비즈

    send(symbol [, args...]) → obj
    send(string [, args...]) → obj

    Invokes the method identified bysymbol, passing it any arguments specified. [...] When the method is identified by a string, the string is converted to a symbol.

    :

    와이즈 비즈 와이즈 비즈  코드가 실행되는 동안obj로 설정되어 코드에obj의 인스턴스 변수에 액세스 할 수 있습니다.

    그래서 instance_eval  

    instance_eval(string [, filename [, lineno]] ) → obj
    instance_eval {| | block } → obj

    Evaluates a string containing Ruby source code, or the given block, within the context of the receiver (obj). In order to set the context, the variable 반면 메소드를 실행   self 를 사용하여 임의의 코드 블록 (문자열 또는 블록)을 실행합니다.   send 를 호출하는 객체로 설정  에.

    귀하의 경우 instance_eval 에 전달하는 문자열과 큰 차이가 없습니다.  하나의 방법 일뿐입니다. 가장 큰 차이점은 6 개월 동안 코드를 읽는 사람이 왜 self 를 사용하는지 궁금해한다는 것입니다  단일 메소드를 호출합니다.

    당신은 또한 instance_eval 에 관심이있을 수 있습니다  그리고 instance_eval

  • 답변 # 2

    instance_eval 로 할 수있는 모든 것   Object#public_send 의 적절한 부분 집합입니다. . 즉, BasicObject#__send__ 에 대한 논쟁   send 에 대한 논증 인 반면, 단일 메소드 (및 그 인수) 여야합니다  임의의 코드입니다. 그래서 당신이 instance_eval 를 할 때마다 send 로 다시 작성할 수 있습니다. , 그러나 그 반대는 아닙니다.

    그러나 성능 측면에서는 instance_method   send 보다 훨씬 빠릅니다   instance_eval 를 실행하는 데 추가 구문 분석이 필요하지 않기 때문에 반면에 send  전체 논쟁을 파싱해야합니다.

    예제에서 결과는 동일하지만 첫 번째 결과는 더 빠릅니다.

    instance_eval

  • 이전 osquery - osquery - 모든 osqueryi 쿼리에서 자세한 마이그레이션 정보 제거
  • 다음 android 스튜디오 javalangnoclassdeffounderror - androidsupportv4appnavutilsjb