Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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 on rails rails在类内有许多访问权限_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails rails在类内有许多访问权限

Ruby on rails rails在类内有许多访问权限,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个rails模型课 class Model < ActiveRecord::Base has_many :object_collection def add_object(object) object_collection.push object // works @object_collection.push object // does not work self.object_collection.push object //

我有一个rails模型课

class Model <  ActiveRecord::Base

  has_many :object_collection


  def add_object(object)
      object_collection.push object // works
      @object_collection.push object // does not work
      self.object_collection.push object // works
  end
end
类模型
我想知道是否有人能向我解释为什么@还不能工作我认为这两个意思是一样的吗


干杯

它们不一样。考虑下面的红宝石代码:

class Person
  attr_accessor :employer
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
方法
attr\u accessor
方便地为您生成属性读写器(
employer=
employer
)。您可以使用这些方法读取和写入存储在实例变量
@employer
中的属性

现在,我们可以将上述内容重写为以下内容,其功能与上述代码相同:

class Person
  def employer=(new_employer)
    @works_for = new_employer
  end
  def employer
    @works_for
  end
end
john = Person.new
john.employer = "ACME"
john.employer # equals "ACME"
现在,不再使用实例变量
@employer
。我们选择手动编写访问器,并且可以自由地为实例变量选择不同的名称。在此特定示例中,实例变量的名称与属性访问器的名称不同。没有什么能阻止你那样做

这类似于
ActiveRecord
在内部存储其属性的方式。它们不存储在同名的实例变量中,这就是为什么对
@object\u集合的
push
调用不起作用的原因


正如您所理解的,属性读取器和编写器提供了某种抽象,可以对您隐藏实现细节。因此,直接在子类中读取和写入实例变量通常被认为是不好的做法。

@foo标识了一个名为@foo的实例变量。foo识别了一个名为foo的方法。 默认情况下,Ruby中的实例变量是私有的。这意味着您不能访问实例变量的值,除非您有公开该值的公共方法

这些方法称为setter和getter。按照惯例,setter和getter具有相同的实例变量名称,但这不是必需的

class MyClass

  def initialize
    @foo
  end

  def foo=(value)
    @foo = foo
  end
  def foo
    @foo
  end

  def an_other_foo=(value)
    @foo = foo
  end
  def an_other_foo
    @foo
  end

end
虽然方法和实例变量可以有相似的名称,但它们有不同的元素。 如果您不清楚这个主题,您可能需要停止使用Rails,重新学习Ruby的工作原理


在您的特定情况下,object_集合不作为实例变量存在,因为它是一种关联方法。

它们的含义不同。一个是实例变量,另一个是方法

@foo表示“实例变量foo的值”,其中as self.foo表示“对我自己调用方法foo的值”

对于方法foo=来说,设置@foo实例变量是很典型的,这样我就可以看出对这种语言不熟悉的人可能会感到困惑。我鼓励你读一本关于ruby语言的书。有一个专门为那些做过一些rails但从未学过ruby的人设计的。您通常可以在不理解语言或这些语句的含义的情况下攻击rails,但与花少量时间学习ruby语言本身的人相比,您的效率要低得多


作为一般规则,尽可能使用self.foo表单,因为它对类定义的更改不太敏感。

所有好的答案都会让大家高兴,