在 Ruby 中都有硬时间了解attr_accessor某人是否可以解释这样给我?我已执行 Google 搜索的吨。我只是不能理解它完全。

2010-12-06 21:07:06
问题评论:

请参阅为什么使用 Ruby 的 attr_accessor、 attr_reader 和 attr_writer?.

Attr_accessor 是否在 Git 工作这一样?我发现一些教程不足够解释,和其他人假设预备知识。

@Angelfirenze, gitattr_accessor与无关。Git 是版本控制软件,而attr_accessor是一种在 Ruby 中的方法.

回答:

假设您有一个类Person.

class Person
end

person = Person.new
person.name # => no method error

很明显,我们永远不会定义方法name让我们做到这一点。

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error

Aha,我们可以读取该名称,但这并不意味着我们可以指定名称。这些都是两种不同的方法。前者称为读取器和后者称为的编写器我们没有创建的编写器,但让我们做到这一点。

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

超。现在我们可以写入和读取实例变量@name使用读取器和编写器的方法。除外,这是相当频繁,因此,为什么浪费时间写这些方法每次吗?我们可以做更容易。

class Person
  attr_reader :name
  attr_writer :name
end

即使这可以得到重复。如果您希望读取器和编写器只需使用访问器 !

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

同样的方式工作 !猜猜看︰ 实例变量@name中我们 person 对象将设置就像当我们手动,做到了使您可以用其他方法来使用它。

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

就是这样。要了解如何attr_readerattr_writerattr_accessor方法实际方法为您生成,阅读其他答案、 书籍、 拼音的文档。

@hakunin-,感谢您清除的答案。什么是我缺少正是 Ruby 语法建议一个冒号: attr_ * 语句中的实例变量?它看起来会很详细明了使用同一 ' @' 用于其他地方的类中引用的变量的语法。

要回答这些问题,您需要了解该attr_accessor是当前类上调用的方法的 @WilliamSmith 和:name是将传递给该方法的参数。它不是一种特殊的语法,它是一个简单的方法调用。如果您要为其指定@name变量,它不会有有意义的因为 @name,则包含nil因此,它就会像写作是attr_accessor nil不传递它创建所需的变量,均通过您想要调用的变量的名称。

@hakunin-总有意义。我只是今天了,ruby 实际正在运行分析通过文件和每个语句和表达式是实际上某些对象上的方法调用被学习。包括 attr_accessor。非常有帮助。

使用的 Rails 3 年,甚至永远不会知道这。耻辱

@Buminda 是,但方法name和变量@name不是同样的事情。不要混淆他们。您有在您的类实例变量@name ,并定义attr_reader :name能够从外部读取它。attr_reader没有简单的方法可以在类的外部访问@name

attr_accessor只是一种方法(该链接应提供更深入地介绍它的工作原理与-看的方法生成的对和教程应该向您展示如何使用它)。

这一轮是class未定义在 Ruby (它是"定义"c + + 和 Java 等语言中的),但它是表达式的计算结果调用attr_accessor方法时又修改当前类的是在这一评估过程中记住隐式接收器︰ self.attr_accessor,其中self是"打开"类对象在这里。

attr_accessor和朋友的需要,很好地︰

  1. 拼音,像由 Smalltalk,不允许外部方法1 ,表示该对象访问实例变量。也就是说,实例变量不能访问x.y形式则常在说,Java 或甚至 Python。在 Ruby 中y始终将作为邮件发送 (或"调用方法")。因此attr_*方法创建实例@variable通过动态访问哪些代理创建方法的包装。

  2. 样板优势

希望这阐明了一些小的细节。祝您工作愉快。


1这不是真正严格和有解决此一些"技巧",但没有语法支持"公共实例变量"访问。

为解释语义 + 1 !

当您说 attr_accessor 是"只是一种方法"得到它。但是到调用方法调用所使用的语法是什么?我找不到部分谈到类似 some_method 的语法的 ruby 文档中︰ 名称 = >"任何",︰ notherName,︰ 等

"只是一种方法"解释了对我来说真的很有帮助。+ 1

attr_accessor是 (作为所述 @pst) 只是一种方法。就不会为您创建更多的措施。

因此此代码在此处︰

class Foo
  attr_accessor :bar
end

等效于此代码︰

class Foo
  def bar
    @bar
  end
  def bar=( new_value )
    @bar = new_value
  end
end

您可以编写方法这种自己在 Ruby 中︰

class Module
  def var( method_name )
    inst_variable_name = "@#{method_name}".to_sym
    define_method method_name do
      instance_variable_get inst_variable_name
    end
    define_method "#{method_name}=" do |new_value|
      instance_variable_set inst_variable_name, new_value
    end
  end
end

class Foo
  var :bar
end

f = Foo.new
p f.bar     #=> nil
f.bar = 42
p f.bar     #=> 42

认为本也帮助在 Google 搜索他"吨",更因为 OP 他最有可能运行在 ruby 的官方文档中的attr_accessor标准定义。

@bowsersenior 您可能是正确的但它确实帮助了我。

这是极好的示例,其中元编程在甚至最初级的方案中使用。很好。

我所寻找的attr_accessor实现草绘并最后一次在这里找到 !尽管它解决了我的问题,但我很想知道在哪里 (本书/官员 doc) 可以找到这样一个实现示例?

attr_accessor是非常简单的︰

attr_accessor :foo

是的快捷方式︰

def foo=(val)
  @foo = val
end

def foo
  @foo
end

没有什么比一个对象 getter/setter 是

快捷方式同音语法糖或某种形式的宏展开解释器 (而不是它实际上是此方法) 通过调用它。

您的答案是可以的。快捷方式意味着"更短备用路由"根据我的词典,不"语法糖"或"解释器解释宏"。

它就是定义实例变量的 getter 和 setter 方法的方法。为实现示例︰

def self.attr_accessor(*names)
  names.each do |name|
    define_method(name) {instance_variable_get("@#{name}")} # This is the getter
    define_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setter
  end
end

处理多个特性以这种方式太棒了 !

内容来源于Stack Overflow What is attr_accessor in Ruby?
请输入您的翻译

What is attr_accessor in Ruby?

确认取消