在Ruby中类实例变量、类实例方法和类变量、类方法的区别比较微妙,而且用法也有相当的区别。本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...
一.类实例变量和类变量
类变量大家都很熟悉了,就是在类定义中用@@开头的变量。类变量是用于存储类的全局信息,它只属于类,不同与类实例变量(即用@开头定义的变量)每一个类的对象都有一份数据。 类变量是可以被继承的,也就是说如果我们派生一个子类,那么在子类中是可以访问父类的类变量的。子类和父类共享一份数据,对一个类的修改会反映到另一个类中。如下边的代码运行结果显示:
class A
#类变量在访问前必须赋值,否则会有"uninitialized class variable“ 错误
@@alpha=123 # Initialize @@alpha
@@beta=456 #Initialize @@beta
@@gamma=789 #Initialize @@gamma
def A.alpha
@@alpha
end
def A.alpha=(x)
@@alpha=x
end
def A.beta
@@beta
end
def A.beta=(x)
@@beta=x
end
def A.gamma
@@gamma
end
def A.gamma=(x)
@@gamma=x
end
def A.look
puts "#@@alpha, #@@beta, #@@gamma"
end
end
class B<A
end
#初始的数据
A.look
B.look
#修改父类中的类变量
A.alpha=111
A.look
B.look
运行结果:
123, 456, 789
123, 456, 789
111, 456, 789
111, 456, 789
那么什么是类的类实例变量呢?类的类实例变量是在类的类方法中或方法外边(不能在实例方法中,那是类的实例变量)以@开头定义的变量,这样定义的变量值属于类对象本身,不能够被子类继承。类对象这个说法可能有些让人疑惑,其实Ruby中的一起都是对象,我们定义的类和Ruby的内置类本身就是元类的对象。因此如果要定义需要和子类共享的类全局数据,使用类变量;但是如果要定义仅供类本身使用的类全局数据可以使用类实例变量。还有一点需要注意的是,和类变量不同的是类实例变量不要求访问前必须赋值,不赋值它的值就是nil 。我们还是看一个例子,能够更清楚一点...
class A
#类的类实例变量在访问前可以赋值也可以不赋值,不赋值就是nil
@alpha=123 # Initialize @alpha
@beta=456 #Initialize @beta
@gamma=789 #Initialize @gamma
def A.alpha
@alpha
end
def A.alpha=(x)
@alpha=x
end
def A.beta
@beta
end
def A.beta=(x)
@beta=x
end
def A.gamma
@gamma
end
def A.gamma=(x)
@gamma=x
end
def A.look
puts "#@alpha, #@beta, #@gamma"
end
end
class B<A
end
A.look
B.look
代码的运行结果如下:
123, 456, 789
, ,
nil
待续................
分享到:
相关推荐
本文将深入探讨Ruby语言中的类变量、全局变量、实例变量,以及多态的概念,并结合Ruby编码规范来阐述如何有效地编写代码。 一、类变量 类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的...
在Ruby语言中,类实例变量、类实例方法与类变量和类方法是构成面向对象编程模型的重要组成部分。它们各自有不同的用途和行为特性,下面详细介绍这些概念的区别以及它们的使用场景。 首先,类实例变量和类实例方法都...
### Ruby中类变量和实例变量的比较 在Ruby编程语言中,类变量和实例变量都是用来存储数据的重要机制。它们虽然都是变量,但在用途、作用范围、生命周期等方面有着明显的区别。接下来,我们将详细介绍这两者之间的四...
Ruby支持类的继承,允许一个类(子类)继承另一个类(父类)的属性和方法。子类使用`<`符号指定其父类,如下所示: ```ruby class Student < Person def study puts "I'm studying hard!" end end ``` 在这个...
在这个例子中,`@title`和`@username`是Ruby对象的实例变量,它们将在运行时被替换为实际的值。ERB引擎会执行这些Ruby代码并替换占位符。 接下来,让我们看看如何在Ruby程序中使用ERB。首先,你需要引入`erb`库: ...
类和对象是Ruby的核心概念,你可以自定义类并创建实例。例如,创建一个名为`Person`的类并初始化姓名: ```ruby class Person def initialize(name) @name = name end end person = Person.new("Alice") ``` Ruby...
在使用Native Image之前,我们需要一个名为`reflection-config.json`的配置文件,用于指定反射相关的类和方法。然后,通过以下命令生成原生镜像: ```bash native-image --no-fallback --no-server --verbose --...
Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下: 一...
本文将详细介绍 Ruby 中的五种主要变量类型:普通变量、全局变量、实例变量、类变量以及常量,并通过示例代码加深理解。 #### 二、Ruby中的变量类型详解 ##### 1. 普通变量 (Variable) - **定义与使用**: - 普通...
1. 变量:Ruby中的变量分为五种类型:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头)、全局变量(以`$`开头)和常量(以大写字母开头)。每种变量都有其作用域和使用场景。 2. ...
此外,Ruby 拥有一个非常强大的标准库,其中包含了大量用于各种任务的类和方法,如文件处理、文本处理等,这使得开发者可以轻松地开发出功能丰富的应用程序。最为人所熟知的是 Ruby on Rails,这是一个基于 Ruby 的 ...
在Ruby on Rails框架中,ActionMail是用于发送电子邮件的一个核心组件。它允许开发者方便地创建、格式化并发送电子邮件,而无需直接与SMTP服务器交互。本篇将详细讲解如何使用ActionMail来实现邮件功能。 首先,...
变量在Ruby中有四种类型:局部变量、实例变量、类变量和全局变量,它们都有特定的标识符前缀。数据类型包括基本类型和复杂类型,如数组、哈希(字典)、集合等。 函数和方法是Ruby的核心组成部分。你可以定义自己的...
- `initialize`是类的构造方法,用于初始化实例变量。 - 类方法通过`def self.method_name`定义。 - 实例方法通过`def method_name`定义。 - `@`前缀的变量为实例变量,`@@`前缀的为类变量。 - 创建类对象:`f ...
变量在Ruby中分为局部变量、实例变量、类变量和全局变量,Referral能够追踪它们的使用情况,有助于识别潜在的变量冲突和未初始化的问题。 此外,Referral还提供了过滤功能,这意味着用户可以定制搜索条件,只关注...
- **继承**:继承使得一个类可以继承另一个类的属性和方法。这是面向对象编程的一个关键特性,它支持代码复用和分层的概念。在Ruby中,可以通过`<`符号来表示继承关系。 - **多态**(Polymorphism):多态是指不同类型...
类可以包含属性(也称为实例变量)和方法。继承允许一个类(子类)继承另一个类(父类)的属性和方法,这样可以实现代码重用和层次结构。子类通过`<`符号指向父类,如`class Child < Parent`。 Ruby还支持模块...
全局变量、实例变量和类变量都可以动态改变,这使得代码可以根据不同的条件改变其行为。 4. **对象**:Ruby中的所有对象都有`class`方法,可以查看或改变其类。此外,`Object#send`方法允许动态调用对象的方法,而`...
【Libxml2 应用实例】\n\nLibxml2 是一个开源的 C 语言实现的 XML 解析器,最初为 GNOME 项目开发,现在广泛应用于多种编程语言,包括 C++、PHP、Pascal、Ruby 和 Tcl 等。这个库在 MIT 许可下发布,可以在 Windows...