루비 : define_method 대 def
프로그래밍 실습으로서 저는 클래스를 생성하고, 해당 클래스에서 두 개의 객체를 인스턴스화하고, 한 객체를 monkeypatch하고, 다른 하나를 monkeypatch하기 위해 method_missing에 의존하는 Ruby 스 니펫을 작성했습니다.
여기에 거래가 있습니다. 이것은 의도 한대로 작동합니다.
class Monkey
def chatter
puts "I am a chattering monkey!"
end
def method_missing(m)
puts "No #{m}, so I'll make one..."
def screech
puts "This is the new screech."
end
end
end
m1 = Monkey.new
m2 = Monkey.new
m1.chatter
m2.chatter
def m1.screech
puts "Aaaaaargh!"
end
m1.screech
m2.screech
m2.screech
m1.screech
m2.screech
method_missing에 대한 매개 변수가 있음을 알 수 있습니다. 적절한 이름으로 누락 된 메서드를 동적으로 생성하기 위해 define_method를 사용하기를 바라고 있었기 때문입니다. 그러나 작동하지 않습니다. 사실, 다음과 같은 정적 이름으로 define_method를 사용하는 경우도 있습니다.
def method_missing(m)
puts "No #{m}, so I'll make one..."
define_method(:screech) do
puts "This is the new screech."
end
end
다음 결과로 끝납니다.
ArgumentError: wrong number of arguments (2 for 1)
method method_missing in untitled document at line 9
method method_missing in untitled document at line 9
at top level in untitled document at line 26
Program exited.
오류 메시지를 더 당황스럽게 만드는 것은 내가 단 하나의 주장 만 가지고 있다는 것입니다 method_missing
.
define_method
is a (private) method of the object Class. You are calling it from an instance. There is no instance method called define_method
, so it recurses to your method_missing
, this time with :define_method
(the name of the missing method), and :screech
(the sole argument you passed to define_method
).
Try this instead (to define the new method on all Monkey objects):
def method_missing(m)
puts "No #{m}, so I'll make one..."
self.class.send(:define_method, :screech) do
puts "This is the new screech."
end
end
Or this (to define it only on the object it is called upon, using the object's "eigenclass"):
def method_missing(m)
puts "No #{m}, so I'll make one..."
class << self
define_method(:screech) do
puts "This is the new screech."
end
end
end
self.class.define_method(:screech) doesn't work,because define_method is private method you can do that
class << self
public :define_method
end
def method_missing(m)
puts "No #{m}, so I'll make one..."
Monkey.define_method(:screech) do
puts "This is the new screech."
end
def method_missing(m)
self.class.class_exec do
define_method(:screech) {puts "This is the new screech."}
end
end
screech method will be available for all Monkey objects.
참고URL : https://stackoverflow.com/questions/185947/ruby-define-method-vs-def
'program tip' 카테고리의 다른 글
Java : java.util.Preferences 실패 (0) | 2020.11.18 |
---|---|
Android : GridView auto_fit은 열 수를 어떻게 찾습니까? (0) | 2020.11.18 |
UITextField에서 리턴 키를 비활성화 / 활성화하는 방법은 무엇입니까? (0) | 2020.11.17 |
PHP에서 call_user_func_array로 생성자를 호출하는 방법 (0) | 2020.11.17 |
MySQL의 열 이름 "order"에 대한 대안 (0) | 2020.11.17 |