我今天在考试中无法理解的东西

时间:2016-12-17 23:59:19

标签: ruby

如何使用此类打印“foo”而不是“foobar”?你无法编辑课程。

convert test.exr -crop 200x100+238+200 +repage -define exr:color-type=Y result.exr

编辑:我刚刚提出了一个解决方案,您可以在其中创建class Test def foo puts "foo" foobar end def foobar puts "foobar" end end 的子类并覆盖Test,以便它只打印“foo”。

2 个答案:

答案 0 :(得分:3)

您可以执行以下操作。

class Test
  def foo
    puts "foo"
    foobar
  end 
  def foobar
    puts "foobar"
  end
end

Test.instance_methods(false)
  #=> [:foo, :foobar] 
Test.new.foo
  # foo
  # foobar

创建别名:foobar

Test.class_eval { alias_method :old_foobar, :foobar }
  #=> Test 
Test.instance_methods(false)
  #=> [:foo, :foobar, :old_foobar]
Test.new.old_foobar
  # foobar
Test.new.foobar
  # foobar

创建存根方法:foobar

Test.class_eval { define_method(:foobar) {} }
  #=> :foobar

试试吧。

Test.new.foo
  # foo

<强>清理

恢复原始:foobar

Test.class_eval { alias_method :foobar, :old_foobar }
  #=> Test
Test.new.foo
  # foo
  # foobar

删除:old_foobar

Test.instance_methods(false)
  #=> [:foo, :foobar, :old_foobar] 
Test.class_eval { remove_method(:old_foobar) }
  #=> Test 
Test.instance_methods(false)
  #=> [:foo, :foobar] 

注意

Test.class_eval { alias_method :old_foobar, :foobar }

生成与

相同的别名:old_foobar
class Test
  alias_method :old_foobar, :foobar
end

但它是动态的。

或者,可以写

Test.send(:alias_method, :old_foobar, :foobar)

但不是

Test.alias_method :old_foobar, :foobar

因为:alias_method是私有的。

这些评论也适用于class_eval的其他两种用途。

答案 1 :(得分:1)

您无法编辑课程。

test = Test.new
test.foo
# => foo
# => foobar

但您可以编辑从Test

实例化的对象
class << test
  def foobar
  end
end
test.foo
# foo

有关详细信息,您可以使用google&#34;单例方法&#34;。