`
wlo_o
  • 浏览: 50510 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

[Ruby 学习笔记] 3. 变量和常量

    博客分类:
  • ruby
阅读更多

变量持有目标对象的引用,和我们所熟悉的 C# / Java 不同的是,Ruby 变量并没有内在类型。作为一种动态解析执行的语言,其变量类型只在其执行期决定,我们也因此能改变变量所持有对象的类型,显然在 C# / Java 里是不允许的 (Object 类型变量和这个不是一回事,如果不明白,建议再看看面向对象理论)。

a = 1
puts a.class #Fixnum
a = "s"
puts a.class #String

或许你看过 C# 3.0,但需要明白这和那个隐式类型变量(Implicitly typed local variables)并不是一回事。"var" 关键字只是一种简写,一种语法糖,编译器会自动推断,并在编译时决定其类型。细节可以参考我前面写的文章。

名字

这里提到的命名规则,仅仅是变量,有关类型、方法的命名参考后面的章节。

(1) 名字由一个大小写字母(a-z)或下划线(_)开头,后跟任意个命名字符(大小写字母、下划线或数字)组成。
(2) 局部变量通常由小写字母开头。
(3) 实例变量名以"@"开始,第一个命名字符小写。
(4) 类变量以 "@@" 开始,第一个命名字符大写。
(5) 全局变量以 "$" 开始。
(6) 常量名通常以大写字母和下划线组成。

关于 Ruby 命名前缀,感觉有点别扭。不过记忆的方法也很简单,根据其作用域,范围越大越有 "钱",自然全局变量是货真价实的 "$",然后是大家(对象实例)共有的"领导"——类变量,每月发两包子(@@);实例变量相比起来,只能是"白领"了,只有一个包子(@);最惨的就是局部变量了,什么都没有…… [cry] ~~~~~
$Global = "Word!"

class Class1
  @@I = 0

  def initialize()
    @name = "Tom!"
  end
  
  def test()
    a = 123456
    puts a
  end
end

常量

Ruby 允许你改变常量值,这对我而言恐怕不是啥好事情。
NAME = "name"

puts NAME
# Line 100, 许木木说: 做好多好多有意义的事情。
# Line ...
# Line 1000, 许木木说: 做好多好多有意义的事情。

NAME = "sss" # 我以为是重新定义了一个常量,其实不小心改了上面 "大哥" 的内容。

puts NAME

输出:
name
sss
main.rb:6: warning: already initialized constant NAME 

输出结果里面的这个警告信息对于程序执行而言,并无任何约束作用。

作用域

在类或模块内的任意位置都可以访问此类或模块中定义的常量,在这之外,可以通过域作用符(::)访问。

示例1
NAME = "Tom"

class Class1
  def test()
    puts NAME
  end
end

puts NAME
Class1.new().test()

示例2
class Class1
  NAME = "Tom"
  
  def test()
    puts NAME
  end
end

puts Class1::NAME
Class1.new().test()

全局变量贯穿整个程序,当我们 load 或 require 一个模块时,也会将其全局变量引入。因此,我们应该避免滥用全局变量,这可能和其他模块造成冲突。就个人感觉而言,我不太喜欢全局变量/常量这种东西,它更多地象很久以前结构化编程的遗迹。

test.rb
$name = "zhangsan"

def test()
  puts $name
end

main.rb
require "test.rb" 

$name = "lisi" # 原本以为创建了个新的家伙,却不小心 "改变" 了 "别人" 的 "财产"。
test()


类变量和 C# 类静态字段基本是一个东西,被所有实例对象共享。而实例变量仅属于当前实例,缺省情况下,在对象外部我们并不能访问它。

 

转自http://www.rainsts.net/article.asp?id=527

分享到:
评论

相关推荐

    个人ruby学习笔记

    从给定的文件信息中,我们可以提炼出一系列关于Ruby编程语言的重要知识点,涵盖基础语法、变量类型、数值操作、条件语句、循环结构以及字符串处理等核心领域。 ### Ruby基础语法 #### 注释 Ruby提供了两种注释方式...

    ruby初学笔记ruby初学笔记

    3. **变量(Variables)**:Ruby有四种类型的变量:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头)和全局变量(以`$`开头)。理解它们的作用域和使用规则非常重要。 4. **控制...

    Ruby自学笔记

    类名在Ruby中必须以大写字母开始,象征着类名是常量。Ruby是一种基于行的语言,通常情况下,每遇到一个换行符就意味着一个语句的结束。Ruby的代码是从上到下依次执行的,且没有所谓的主程序。如果需要,可以通过引用...

    ruby笔记2ruby笔记2ruby笔记2

    "ruby笔记2ruby笔记2ruby笔记2"可能是指一系列关于Ruby学习的笔记,这些笔记可能涵盖了Ruby的基础概念、核心特性以及进阶话题。在Ruby的学习过程中,理解和掌握以下几个关键知识点至关重要: 1. **面向对象编程...

    Ruby知识点笔记

    局部变量、方法参数和方法名通常以小写字母或下划线开头,全局变量以美元符号($), 实例变量以 (@),类变量以 (@@),类名、模块名和常量则以大写字母开头。实例变量只能在对象内部通过方法访问,体现了Ruby的强制封装...

    JAVA毕业实习日志.docx

    作者也记录了自己学习的笔记,包括变量的命名、注释语句、常量的使用、数组的定义格式、基本类型的转化等。 知识点摘要 1. path用于操作系统查找命令的路径,其中`;`代表分割不同的路径。 2. Java_home在Windows下...

    jvm中篇笔记.md

    - 每个 Class 文件对应着唯一的一个类或接口的定义信息,但 Class 文件本身可以包含更多元的数据结构,例如常量池、字段和方法表等。 #### 总结 通过以上内容的学习,我们可以了解到 Java 虚拟机的核心在于其强大...

    疯狂JAVA之学习笔记(1--15)

    - **方法区**:存储类信息、常量、静态变量等数据。 #### 4. JVM 的抽象架构 JVM 设计为一个抽象的计算机模型,可以实现为软件或硬件。它的主要目标是在任何操作系统或硬件架构上都能运行 Java 字节码。JVM 的核心...

    黑马程序员基础班精华笔记总汇

    ### 黑马程序员基础班精华笔记总汇 #### 计算机基础知识 - **计算机定义**:计算机是一种能够根据程序指令处理数据的电子设备。它由硬件和软件两大部分构成。 - **硬件**:包括中央处理器(CPU)、内存、硬盘、...

    TIL:今天我学到了

    这个目录可能包含了一系列关于Ruby学习的笔记、代码示例、练习项目或其他资源。 详细知识点: 1. **面向对象编程**:Ruby是一种纯面向对象的语言,所有数据都是对象,每一个操作都可以看作是对对象的方法调用。 2...

    note:笔记

    在“note-main”笔记中,可能会介绍如何定义变量,如局部变量(`local_variable`)、实例变量(`@instance_variable`)和全局变量(`$global_variable`)。Ruby支持四种主要的数据类型:字符串(String)、整数...

    RB101

    【标题】RB101,通常在IT领域中,这可能是某个课程、教程或项目的代号,特别是当它与编程语言相关时。...通过这个课程,学习者将能够编写、理解和调试简单的Ruby程序,为进一步深入学习和实际开发奠定基础。

    W5D1

    3. **函数与方法**:讲解如何定义和调用函数,理解参数传递,以及 Ruby 中的块(block)、Proc 和 Lambda 的使用。 4. **面向对象编程**:Ruby 是一种强面向对象的语言,所以会深入讲解类(class)、对象(object)...

    OwnResearchs:记录所思所想

    3. **Playgrounds**:Swift提供了一个名为Playgrounds的工具,允许开发者实时测试代码,查看结果,这对于学习和调试非常有帮助。 4. **Type Inference**:Swift具有强大的类型推断能力,可以自动推断变量和常量的...

Global site tag (gtag.js) - Google Analytics