Ruby变量中的实例变量

实例变量以at sign(@)开头,只能在类方法中引用。它们与局部变量的不同之处在于它们不存在于任何特定范围内。相反,为类的每个实例存储一个类似的变量表。实例变量存在于类实例中,只要该实例保持活动状态,实例变量也是如此。

实例变量可以在该类的任何方法中引用。一个类的所有方法都使用相同的实例变量表,而不是每个方法将具有不同变量表的局部变量。但是,可以在不首先定义实例变量的情况下访问实例变量。这不会引起异常,但变量's值将,如果您've使用-w开关运行Ruby,将发出警告。

这个例子演示了实例变量的使用。请注意,shebang包含-w开关,如果发生警告,将打印警告。另外,请注意类范围内方法之外的错误用法。这是不正确的,下面讨论。

为什么@test变量不正确?这与范围以及Ruby如何实现事物有关。在一个方法中,实例变量范围指的是该类的特定实例。但是,在类范围内(在类内部,但在任何方法之外),范围是类实例范围。Ruby通过实例化class对象来实现类层次结构,因此这里有一个第二个实例。**个实例是ClassClass的实例,这是@test将去的地方。第二个实例是TestClass的实例化,这是@value将去的地方。这有点令人困惑,但请记住,不要在方法之外使用@实例变量。如果您需要类范围的存储,请使用@@@@@classëvariables,这可以是在类范围内的任何地方(方法内部或外部)使用,并且行为相同。

Accessors

您通常无法从对象外部访问实例变量。例如,在上面的示例中,您不能简单地调用t.valuet.@value来访问实例变量@value。这将打破封装的规则。这也适用于子类的实例,它们不能访问属于父类的实例变量,即使它们在技术上是相同的类型。因此,为了提供对实例变量的访问,必须声明accessor方法。

以下示例演示了如何编写访问方法。但是,请注意,Ruby提供了一个快捷方式,并且此示例仅用于显示accessor方法的工作方式。除非加入者需要某种额外的逻辑,否则通常不会看到以这种方式编写的加入方法。

快捷方式使事情变得更容易和更紧凑。有三种辅助方法。它们必须在类范围内运行(在类内部但在任何方法之外),并且将动态定义方法,就像上面示例中定义的方法一样。这里没有魔术,它们看起来像语言关键字,但它们实际上只是动态定义方法。而且,这些加入者通常排在班级的首位。这为读者提供了一个即时的概述,哪些成员变量将在类外或子类中可用。

有三种加入方法。他们每个人都有一个描述要访问的实例变量的符号列表。

  • attrëreader-Define"reader"方法,例如上述示例中的name方法。
  • attrëwriter-Define"writer"方法,例如上面的age=方法示例。
  • attrŤaccessor-定义"阅读器"和"写入器"方法。

何时使用实例变量

现在你知道什么样的实例变量,你什么时候使用它们?当它们表示对象的状态时,应该使用实例变量。学生'姓名和年龄,成绩等。他们不应该't用于临时存储,即's本地变量用于什么。但是,它们可能会用于多阶段计算的方法调用之间的临时存储。但是,如果您这样做,您可能需要重新考虑您的方法组成,并将这些变量转换为方法参数。

水果与健康知识

教育_1