使用lambda在单个实例上重新定义单个ruby方法
在Ruby中,有没有一种方法可以使用proc重新定义类的特定实例的方法?例如:使用lambda在单个实例上重新定义单个ruby方法,ruby,oop,Ruby,Oop,在Ruby中,有没有一种方法可以使用proc重新定义类的特定实例的方法?例如: class Foo def bar() return "hello" end end x = Foo.new y = Foo.new str1 = "Hello" str2 = "Foo" class <<str1 def to_spanish 'Hola' end end (大概是这样的): 制作: hello goodbye 谢谢 def define_sin
class Foo
def bar()
return "hello"
end
end
x = Foo.new
y = Foo.new
str1 = "Hello"
str2 = "Foo"
class <<str1
def to_spanish
'Hola'
end
end
(大概是这样的):
制作:
hello
goodbye
谢谢
def define_singleton_method_by_proc(obj, name, block)
metaclass = class << obj; self; end
metaclass.send(:define_method, name, block)
end
p = proc { "foobar!" }
define_singleton_method_by_proc(y, :bar, p)
您可以使用语法
类我不确定添加了哪个版本的Ruby(至少1.8.7),但似乎有一种更简单的方法:
str1 = "Hello"
str2 = "Goodbye"
def str1.to_spanish
"Hola"
end
puts str1 # => Hello
puts str1.to_spanish # => Hola
puts str2 # => Goodbye
puts str2.to_spanish # => Throws a NoMethodError
在阅读(about_class_methods.rb课程)时了解到这一点。
我仍然不能完全确定这是为了什么,因为这对我来说似乎有点危险。如果他在一个简单变量中有一个外部定义的proc,那么很难将其放入ClassName创建的新范围谢谢你发布这个(更多)最新的答案!假设已经定义了str.to_西班牙语
,我想“重新定义”它,我如何从新定义的一个内调用“original”str.to_西班牙语
?如果str
是您的实例对象,而String
是您的类,你可以通过String调用该类的方法版本。我爱RubyWonding,对西班牙语上帝说,为什么最后一个解决方案“可能不符合你的需要”?两者都是:``class Foo end obj=Foo.new class@AbdulRahmanK,因为他问了如何使用lambda,而这种方式不使用lambda,但我还是想包含它
class << y
define_method(:bar, proc { "foobar!" })
end
class << y
define_method(:bar) { "foobar!" }
end
def y.bar
"goodbye"
end
str1 = "Hello"
str2 = "Foo"
class <<str1
def to_spanish
'Hola'
end
end
str1 = "Hello"
str2 = "Goodbye"
def str1.to_spanish
"Hola"
end
puts str1 # => Hello
puts str1.to_spanish # => Hola
puts str2 # => Goodbye
puts str2.to_spanish # => Throws a NoMethodError