【问题标题】:Inheritance in RubyRuby 中的继承
【发布时间】:2016-06-20 19:03:33
【问题描述】:

在 Ruby 中,一切都是对象。所以如果我们有一个类Hello,它就是一个父类Object的实例。

如果我在 Ruby 中执行以下操作:

Hello = Class.new
World = Class.new(Hello)

这是否会转化为以下内容?

class Hello
class World < Hello

既然在Ruby中不能进行多重继承,那么new方法应该只带一个参数吗?

【问题讨论】:

  • Ruby 中的大多数东西都是对象,但也有很多例外。示例包括块、if 子句、未作为方法、循环和变量(它们本身,而不是它们的值)实现的运算符。

标签: ruby oop inheritance


【解决方案1】:

是和不是。是的,因为正如您所写,它最终会得到相同的结果(假设您将添加缺少的ends)。不,因为一般情况下差异很小。要在 Class.new 中定义任何内容,您需要传递一个 ruby​​ 块,该块承载并可以完全访问创建它的上下文。所以:

value = :hello

Hello = Class.new do
  define_method value do
    value
  end
end

Hello.new.hello #=> :hello
value = :world
Hello.new.hello #=> :world

请注意,方法的名称没有改变。但是,它返回的值确实如此。这并不理想,这也是为什么在大多数情况下首选class Hello 以避免意外这样做的原因(与def 关键字优于define_method 相同)。

这不适用于 class 关键字,因为它不会创建 ruby​​ 块:

class Hello2
  define_method value do
    value
  end
end

#=> undefined local variable or method `value`

关于类和常量的一个更有趣的事实是name 方法的行为:

my_variable = Class.new
my_variable.name #=> nil

Hello = my_variable
my_variable.name #=> "Hello"

World = my_variable
my_variable.name #=> "Hello"

【讨论】:

    【解决方案2】:

    是的。对两者都有利(除了你的后一个代码无效)。

    请注意,您的“Hello 它是父类 Class 的一个实例。”是错的。 HelloClass 的一个实例,但它的父级不是Class,而是Object

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多