2011-10-30 62 views
3

如何在以下case..the名传递参数名正在被传递给class_evalclass_eval如何参数传递给方法


class Foo 

end 

Foo.class_eval %Q{ 
def hello(name) 
p "hello #{name}" 
end 
} 

 

很抱歉没有给整个方案之前评估.. 我只是想动态地给一个类添加一个实例方法,并且该方法应该能够引用参数... 上面的代码不会编译抱怨在irb中执行时没有将该名称定义为本地变量..

谢谢

+0

不知道你在问什么;你想改变参数的名字为'hello'?哦,我明白了 - 答案是最简单的解决方案。 –

+0

你的问题几乎没有一致 – horseyguy

回答

3

其他的答案是“正确”的答案,但你也可以只跳过p调用内部插值:

Foo.class_eval %Q{ 
    def hello(name) 
    p "hello \#{name}" 
    end 
} 

我想你想改变的实际参数名称(完成或可能有用的采用动态方法撬)时,这里假设它是在一个全球性的,但也可以传递到做一个方法class_eval

Foo.class_eval %Q{ 
    def hello(#{$argname}) 
    p "hello \#{$argname}" 
    end 
} 
+0

谢谢...它的工作原理... – coool

+0

@coool其他人也;)他们是也许更好的答案;清洁器。 –

1

真正简单:

Foo.class_eval do 
    def hello(name) 
     p "hello #{name}" 
    end 
end 
0

尝试传递一个块到class_eval而不是数组(from this link):

class Foo 
end 

Foo.class_eval { 
    def hello(name) 
    p "hello #{name}" 
    end 
} 

然后,可以调用实例方法hello以通常的方式:

boo = Foo.new 
boo.hello("you") 

其中产生:

>> boo.hello("you") 
"hello you" 
=> nil 
+0

我想传递一个字符串/创建一个新的方法字符串..感谢你回答 – coool

0
class Foo 
end 

Foo.class_eval do 
    define_method :hello do |name| 
    p "hello #{name}" 
    end 
end 

Foo.new.hello("coool") # => "hello coool" 
+1

红宝石有很多方法做事情......动态添加方法......干杯 – coool

+0

为什么你使用'define_method'而不是'def'? :) – horseyguy

+0

与#class_eval被用来代替类开放的原因完全一样:就像那样:-) –