그들이 여기서 말하는 것을 루비에서 어떻게 할 수 있습니까?
객체에서 어떻게 기능을 수행 하시겠습니까? 그리고 어떻게 전역 기능을 수행 할 것 입니까 (언급 된 게시물에 대한 jetxee의 답변 참조 )?
예제 코드 :
event_name = "load"
def load()
puts "load() function was executed."
end
def row_changed()
puts "row_changed() function was executed."
end
#something here to see that event_name = "load" and run load()
업데이트 :
전역 방법에 어떻게 접근합니까? 아니면 내 글로벌 기능?
나는이 추가 라인을 시도
puts methods
로드되지 않은 경우 load 및 row_change.
답변
객체에서 직접 함수를 호출하려면
a = [2, 2, 3]
a.send("length")
# or
a.public_send("length")
예상대로 3을 반환합니다.
또는 모듈 기능
FileUtils.send('pwd')
# or
FileUtils.public_send(:pwd)
지역적으로 정의 된 방법
def load()
puts "load() function was executed."
end
send('load')
# or
public_send('load')
선적 서류 비치:
답변
세 가지 방법 : send/ call/ eval-및 벤치 마크
일반적인 호출 (참조 용) :
s= "hi man"
s.length #=> 6
사용 send
s.send(:length) #=> 6
사용 call
method_object = s.method(:length)
p method_object.call #=> 6
사용 eval
eval "s.length" #=> 6
벤치 마크
require "benchmark"
test = "hi man"
m = test.method(:length)
n = 100000
Benchmark.bmbm {|x|
x.report("call") { n.times { m.call } }
x.report("send") { n.times { test.send(:length) } }
x.report("eval") { n.times { eval "test.length" } }
}
보시다시피, 메소드 객체를 인스턴스화하는 것은 메소드를 호출하는 가장 빠른 동적 방법이며, eval을 사용하는 속도도 느립니다.
#######################################
##### The results
#######################################
#Rehearsal ----------------------------------------
#call 0.050000 0.020000 0.070000 ( 0.077915)
#send 0.080000 0.000000 0.080000 ( 0.086071)
#eval 0.360000 0.040000 0.400000 ( 0.405647)
#------------------------------- total: 0.550000sec
# user system total real
#call 0.050000 0.020000 0.070000 ( 0.072041)
#send 0.070000 0.000000 0.070000 ( 0.077674)
#eval 0.370000 0.020000 0.390000 ( 0.399442)
크레딧은이 블로그 게시물 로 이동 하여 세 가지 방법에 대해 좀 더 자세히 설명하고 방법이 있는지 확인하는 방법도 보여줍니다.
답변
이것을 사용하십시오 :
> a = "my_string"
> meth = a.method("size")
> meth.call() # call the size method
=> 9
간단 하죠?
global에 관해서 는 Ruby 방법이 methods메소드를 사용하여 검색하는 것이라고 생각합니다 .
답변
개인적으로 함수 참조에 해시를 설정 한 다음 문자열을 해시의 인덱스로 사용합니다. 그런 다음 매개 변수와 함께 함수 참조를 호출하십시오. 이것은 잘못된 문자열이 호출하고 싶지 않은 것을 호출하지 못하게하는 이점이 있습니다. 다른 방법은 기본적으로 eval문자열입니다. 이러지 마십시오.
추신 : 게으르지 않고 실제로 무언가에 연결하는 대신 전체 질문을 입력하십시오.
답변
