Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用lambda在单个实例上重新定义单个ruby方法_Ruby_Oop - Fatal编程技术网

使用lambda在单个实例上重新定义单个ruby方法

使用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

在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_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