Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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/8/meteor/3.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
Ruby 由attr_访问器创建的方法对子类不可用_Ruby - Fatal编程技术网

Ruby 由attr_访问器创建的方法对子类不可用

Ruby 由attr_访问器创建的方法对子类不可用,ruby,Ruby,(stackoverflow正在破坏格式) 在以下情况下,由Human创建的方法名称对Boy不可用。我的理解正确吗,attr_访问器方法不正确 可用于子类。我需要使用超类来访问attr\u accessor添加的方法。您正在寻找的是cattr\u accessor,它解决了这个特定问题: 以下是您的示例,已修复: class Human def self.age @age = 50 end def self.age=(input) @age = input en

(stackoverflow正在破坏格式)

在以下情况下,由Human创建的方法名称对Boy不可用。我的理解正确吗,attr_访问器方法不正确
可用于子类。我需要使用超类来访问attr\u accessor添加的方法。

您正在寻找的是cattr\u accessor,它解决了这个特定问题:

以下是您的示例,已修复:

class Human
  def self.age
    @age = 50
  end
  def self.age=(input)
    @age = input
  end

  cattr_accessor :name

  self.name = 'human'
end
class Boy < Human
end

puts Human.age
puts Boy.age
puts Human.name
puts Boy.superclass.name
puts Boy.name # => 'human'
类人类
自我年龄
@年龄=50
结束
def self.age=(输入)
@年龄=输入
结束
cattr_访问器:名称
self.name='human'
结束
班上男孩<人
结束
把人类的年龄
把男孩的年龄
把人名
输入Boy.superclass.name
将Boy.name#=>“人类”

人和男孩是两个不同的对象。两个对象永远不能共享一个实例变量。它们都有该方法,但该方法将访问对象的适当ivar。

Rails
class\u属性
方法在这种情况下会更好


cattr\u访问器
使所有类和这些类的实例共享相同的属性值。我不确定这是否是正确的行为。它们都访问相同的属性,所以这是有意义的。如果要为子类声明不同的值,可能需要重新声明cattr_访问器。我应该提到我使用cattr_访问器解决了这个问题。然而,我真的很想了解attr_访问器是如何工作的。我的理解是它存储了一个实例变量。但是子类可以使用即时变量。所以真正的问题是为什么Boy.name返回零。还有,为什么我不能在mac/FF上使用此站点的代码块。访问者不存储实例变量。您可以定义实例变量,而无需使用访问器。访问器用于公开实例变量。您可以通过缩进4个空格或突出显示块并选择“101010”图标来突出显示代码。我自己刚刚尝试过,它成功了-该方法对Boy可用-当然Boy.name为零,因为Boy没有名字。问题是你想让男孩继承人类的名字,而不是拥有自己的名字吗?要点已经不可用了。