그들이 여기서 말하는 것을 루비에서 어떻게 할 수 있습니까?
객체에서 어떻게 기능을 수행 하시겠습니까? 그리고 어떻게 전역 기능을 수행 할 것 입니까 (언급 된 게시물에 대한 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
문자열입니다. 이러지 마십시오.
추신 : 게으르지 않고 실제로 무언가에 연결하는 대신 전체 질문을 입력하십시오.