문제

그래서 객체에 대한 싱글 톤 방법을 정의하고 싶지만 폐쇄를 사용하여하고 싶습니다.

예를 들어,

def define_say(obj, msg)
  def obj.say
    puts msg
  end
end

o = Object.new
define_say o, "hello world!"
o.say

"def"를 통해 싱글 톤 방법을 정의하는 것은 폐쇄가 아니기 때문에 "msg"가 정의되지 않은 변수 또는 메소드라는 예외를 얻습니다.

내가하고 싶은 것은 모듈 클래스에서 "define_method"메소드를 사용하는 것과 같은 것이지만, 내가 알 수있는 한, 이것은 클래스의 메소드를 정의하는 데만 사용될 수 있지만 싱글 톤 방법을 원합니다. ..

그래서 나는 다음과 같은 글을 쓰고 싶습니다.

def define_say(obj, msg)
  obj.define_singleton_method(:say) {
    puts msg
  }
end

누구든지 Proc를 저장하고 싱글 톤 방법 내에서 Proc를 사용하지 않고이 작업을 달성 할 수있는 방법을 아는 사람이 있습니까? (기본적으로, 나는 이것을하는 깨끗하고 무심한 방법을 원한다)

도움이 되었습니까?

해결책

여기에 당신이 찾고있는 일을하는 답이 있습니다.

def define_say(obj, msg)
  # Get a handle to the singleton class of obj
  metaclass = class << obj; self; end 

  # add the method using define_method instead of def x.say so we can use a closure
  metaclass.send :define_method, :say do
    puts msg
  end
end

사용법 (IRB에서 붙여 넣기)

>> s = "my string"
=> "my string"
>> define_say(s, "I am S")
=> #<Proc:0xb6ed55b0@(irb):11>
>> s.say
I am S
=> nil

더 많은 정보 (그리고 덜 지저분하게 만드는 작은 라이브러리)를 보려면 다음을 읽으십시오.

http://viewsourcecode.org/why/hacking/seeingmetaclassesclearly.html

제쳐두고, 당신이 루비 프로그래머이고, 그것을 읽지 않았다면, 지금 가십시오 ~!

다른 팁

Object#define_singleton_method 그건 그렇고 Ruby-1.9.2에 추가되었습니다.

def define_say(obj, msg)
  obj.define_singleton_method(:say) do
    puts msg
  end
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top