Ruby类

类定义

  1. #!/usr/bin/ruby
  2. class Sample
  3. def hello
  4. puts "Hello Ruby!"
  5. end
  6. end
  7. # 使用上面的类来创建对象
  8. object = Sample. new
  9. object.hello

注意:无参数的函数调用可以省略()

初始化方法

初始化方法有一个统一的名字叫 initialize
  1. class Customer
  2. @@no_of_customers=0
  3. def initialize(id, name, addr)
  4. @cust_id=id
  5. @cust_name=name
  6. @cust_addr=addr
  7. end
  8. end

Ruby变量

ruby支持5种类型
  • 一般小写字母、下划线开头:变量(Variable)。
  • $开头:全局变量(Global variable)。
  • @开头:实例变量(Instance variable)。
  • @@开头:类变量(Class variable)类变量被共享在整个继承链中
  • 大写字母开头:常数(Constant)。

变量(就是 局部变量)

变量的打印

变量在打印的时候不能省略 大括号,别的类型变量都可以省略大括号,比如
你这样打印变量是打不出东西的
错误的写法
  1. a=1
  2. b=2
  3. puts "a: #a"
  4. puts "b: #b"

打印结果

  1. a: #a
  2. b: #b

正确的写法

  1. a=1
  2. b=2
  3. puts "a: #{a}"
  4. puts "b: #{b}"

打印结果

  1. a: 1
  2. b: 2

变量的生存周期

变量的生存周期只在方法中,出了方法就没了,所以也只能定义在方法里面,比如
错误的写法
  1. class Test2
  2. a=1
  3. b=2
  4. def printVar()
  5. puts "a: #{a}"
  6. puts "b: #{b}"
  7. end
  8. end
  9. hellotest = Test2.new
  10. hellotest.printVar()

输出

  1. test.rb:5:in `printVar': undefined local variable or method `a' for #<Test2:0x00000002cf2248> (NameError)
  2. from test.rb:10:in `<main>'

正确的写法

  1. class Test2
  2. def printVar(a,b)
  3. puts "a: #{a}"
  4. puts "b: #{b}"
  5. end
  6. end
  7. hellotest = Test2.new
  8. hellotest.printVar(1,2)

输出

  1. a: 1
  2. b: 2

变量的传递

简单类型是值拷贝(字符串也是简单对象,这点跟java不一样)

  1. class Test2
  2. def testPass(a,b)
  3. puts "before add : a: #{a}  b: #{b}"
  4. addVar(a,b)
  5. puts "after add : a: #{a}  b: #{b}"
  6. end
  7. def addVar(a,b)
  8. a += 1
  9. b += 2
  10. end
  11. end
  12. hellotest = Test2.new
  13. hellotest.testPass(1,2)

输出

  1. before add : a: 1  b: 2
  2. after add : a: 1  b: 2

复杂对象是对象引用

  1. class Obj1
  2. def initialize(a)
  3. @a=a
  4. end
  5. def printVal()
  6. puts "a: #@a"
  7. end
  8. def setA(a)
  9. @a=a
  10. end
  11. def getA()
  12. return @a
  13. end
  14. end
  15. class Test2
  16. def testPass()
  17. testobj = Obj1.new("hello")
  18. a = testobj.getA()
  19. puts "before add : a: #{a}"
  20. addVar(testobj)
  21. a = testobj.getA()
  22. puts "after add : a: #{a}"
  23. end
  24. def addVar(obj)
  25. obj.setA(obj.getA() + " world")
  26. end
  27. end
  28. hellotest = Test2.new
  29. hellotest.testPass()

输出

  1. before add : a: hello
  2. after add : a: hello world

实例变量

实例变量的打印

实例变量的打印是可以省略大括号的,比如 #@a  跟 #{@a} 是一回事

实例变量的生存周期

实例变量只能在 initialize 里面被定义。如果想像在java中这样定义是错误的
  1. class LearnInstanceVar
  2. @a=1
  3. def printVar()
  4. puts "a: #{@a}"
  5. end
  6. end
  7. test1 = LearnInstanceVar.new
  8. test1.printVar

输出

  1. $ ruby test.rb
  2. a:

正确的定义

  1. class LearnInstanceVar
  2. def initialize(a)
  3. @a=a
  4. end
  5. def printVar()
  6. puts "a: #{@a}"
  7. end
  8. end
  9. test1 = LearnInstanceVar.new("hello")
  10. test1.printVar

输出

  1. $ ruby test.rb
  2. a: hello

类似java中的private,但是更严格,连定义的位置都只能放在特定的方法里面

类变量

类变量的打印

类变量的打印是可以省略大括号的,比如 #@@a  跟 #{@@a} 是一回事

类变量的生存周期

  • 类变量可以在多个实例之间公用,类似java的 static
  • 在类的方法体以外声明
比如这样定义和使用类变量
  1. #!/usr/bin/ruby
  2. class Customer
  3. @@no_of_customers=0
  4. def printCus()
  5. @@no_of_customers += 1
  6. puts "Total number of customers : #{@@no_of_customers}"
  7. end
  8. end
  9. cust1=Customer.new
  10. cust2=Customer.new
  11. cust1.printCus()
  12. cust2.printCus()
 

全局变量

  • 全局变量以$符号打头
  • 全局变量可以在类与类之间共享

Ruby 运算符

下面只说ruby比较特殊的一些运算符

比较运算符

== 和 equal?

== 和 equal 跟java中定义的正好相反:
  • equal? 是比较两个对象是否是同一个对象
  • == 是比较两个对象是否相等
例子
  1. a = "Ruby" # 定义一个字符串对象
  2. b = "Ruby" # 虽然和a的内容相同,但是他们是不同的对象
  3. a.equal?(b) # false: a和b指向不同的对象
  4. a == b # true: 他们的内容是相同的

eq? 是 equal? 的缩写

<=>  联合比较运算符

这是一个神奇的运算符:联合比较运算符。如果第一个操作数等于第二个操作数则返回 0,如果第一个操作数大于第二个操作数则返回 1,如果第一个操作数小于第二个操作数则返回 -1。

=== 三等号

这个运算符更神奇:
通常情况下这中方式与==是一样的,但是在某些特定情况下,===有特殊的含义:

  • 在Range中===用于判断等号右边的对象是否包含于等号左边的Range;
  • 正则表达式中用于判断一个字符串是否匹配模式,
  • Class定义===来判断一个对象是否为类的实例,
  • Symbol定义===来判断等号两边的符号对象是否相同。
例子:
  1. (1..10) === 5 # true: 5属于range 1..10
  2. /\d+/ === "123" # true: 字符串匹配这个模式
  3. String === "s" # true: "s" 是一个字符串类的实例
  4. :s === "s" # true

.eql?

如果接收器和参数具有相同的类型和相等的值,则返回 true。比如 1 == 1.0 返回 true,但是 1.eql?(1.0) 返回 false。
 

并行赋值

  1. a = 10
  2. b = 20
  3. c = 30

可以写成这样

  1. a, b, c = 10, 20, 30

于是在java和c中很麻烦的变量交换,在ruby中可以很简单的写成

  1. a, b = b, c

这样的代码

  1. a=1
  2. b=2
  3. c=3
  4. a,b=b,c
  5. puts "a: #{a}"
  6. puts "b: #{b}"
  7. puts "c: #{c}"

执行结果为

  1. $ ruby test.rb
  2. a: 2
  3. b: 3
  4. c: 3

范围运算符

  • 1..10 创建了一个从1 到10的范围,并且包含10
  • 1...10 跟上面那个唯一的不同是不包含10

define? 运算符

我们在别的语言中都见到过如何判断变量是否被定义的方法,比如js的是否等于undefined,和php的isset,ruby专门为这种操作设计了一个运算符叫 define? 这个运算符不仅可以告诉你该变量是否定义还可以告诉你变量的范围
defined? variable # 如果 variable 已经初始化,则为 True
比如
  1. foo = 42
  2. defined? foo    # => "local-variable"
  3. defined? $_     # => "global-variable"
  4. defined? bar    # => nil(未定义)

还可以检测方法是否定义了

  1. defined? method_call # 如果方法已经定义,则为 True
  1. defined? puts        # => "method"
  2. defined? puts(bar)   # => nil(在这里 bar 未定义)
  3. defined? unpack      # => nil(在这里未定义)

Ruby 点运算符 "." 和双冒号运算符 "::"

请记住:在 Ruby 中,类和方法也可以被当作常量。
您只需要在表达式的常量名前加上 :: 前缀,即可返回适当的类或模块对象。
如果未使用前缀表达式,则默认使用主 Object 类。
例子
  1. MR_COUNT = 0        # 定义在主 Object 类上的常量
  2. module Foo
  3. MR_COUNT = 0
  4. ::MR_COUNT = 1    # 设置全局计数为 1
  5. MR_COUNT = 2      # 设置局部计数为 2
  6. end
  7. puts MR_COUNT       # 这是全局常量
  8. puts Foo::MR_COUNT  # 这是 "Foo" 的局部常量

Ruby类的更多相关文章

  1. 雷林鹏分享:Ruby 类和对象

    Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...

  2. 雷林鹏分享:Ruby 类案例

    Ruby 类案例 下面将创建一个名为 Customer 的 Ruby 类,您将声明两个方法: display_details:该方法用于显示客户的详细信息. total_no_of_customers ...

  3. Ruby 类和对象

    Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...

  4. Ruby类的继承

    Ruby继承的语法 class DerivedClass < BaseClass #some stuff end < 为继承符号 重写(override) 的概念 有时, 我们希望子类从父 ...

  5. Ruby类的创建与使用

    Ruby是一种面向对象编程语言,这意味着它操纵的编程结构称为"对象" 先上代码, 了解类的定义与使用方式 class Computer $manufacturer = " ...

  6. Ruby类,模块1

    类的扩展和继承 class Fixnum def dosome(str) puts str end def abs puts "覆盖了原有的方法" end end puts 1.c ...

  7. ruby 类创建-继承-消息

    ############################################# #create ruby a class #@符号表示实例变量,相当于java的private 属性 ### ...

  8. Ruby类扩张(extension)

    创建: 2017/09/07 更新: 2017/09/16 修改标题字母大小写 ruby ---> Ruby    扩张类  class 类名     扩张的内容  end           ...

  9. Ruby 类案例

    #!/user/bin/ruby # -*-coding:UTF-8-*- class Customer @@no_of_customers=0 def initialize(id,name,addr ...

随机推荐

  1. 安全退出app,activoty栈管理

    前言 由于一个同学问到我如何按照一个流程走好之后回到首页,我以前看到过4个解决方案,后来发现有做个记录和总结的必要,就写了这篇博文.(之前看小强也写过一篇,这里通过自身的分析完整的总结一下以下6种方案 ...

  2. 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三

    原文:Getting Started with Sencha Touch 2: Build a Weather Utility App (Part 3) 作者:Lee BoonstraLee is a ...

  3. Unity3D学习笔记(三)Unity的C#基础

    在C#脚本中,必须显式的继承MonoBehaviour类需要注意的是,在创建C#脚本时,脚本名应尽量符合C#命名规则,以字母或下划线开头,因为类名的默认跟随脚本名.C#声明变量的方式和C++和Java ...

  4. 并发服务器--02(基于I/O复用——运用Select函数)

    I/O模型 Unix/Linux下有5中可用的I/O模型: 阻塞式I/O 非阻塞式I/O I/O复用(select.poll.epoll和pselect) 信号驱动式I/O(SIGIO) 异步I/O( ...

  5. 【Java编程】Java中的大整数计算

    在上一篇文章中,我们实现了c语言中的大整数的运算,并且用Miller-Rabin算法实现了对大素数的测试.本来我准备用Java代码实现大整数的运算,查了一下资料发现Java中java.math的Big ...

  6. SQL 是一门美丽的语言 她来自艺术

           有一种语言可以从诞生一直活跃到现在,有一个梦想从南四楼蔓延到北五楼再走向世界,有一种坚持可以从懵懂年少成长为干练成熟,有一本书可以温暖心灵彼岸,与数据库抨击撞出火花,有一个系统足以让你忘 ...

  7. MFC中char*,string和CString之间的转换

    MFC中char*,string和CString之间的转换 一.    将CString类转换成char*(LPSTR)类型 方法一,使用强制转换.例如:  CString theString( &q ...

  8. Xcode使用心得01:断点中断问题和调整编译目标

    在obj-c系列博文里,我们粗浅的介绍了obj-c的一些语法以及F库中的一些标准类的使用,但是实际编写拿得出手的APP还是得老老实实在os x上用Xcode写啊!最近上网无意中发现还有支持os x和i ...

  9. Apache Kafka简介与安装(二)

    Kafka在Windows环境上安装与运行 简介 Apache kafka 是一个分布式的基于push-subscribe的消息系统,它具备快速.可扩展.可持久化的特点.它现在是Apache旗下的一个 ...

  10. Java核心技术第四章——1.封装性

    封装性(有时称为数据隐藏): 实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域值.程序仅通过对象的方法与对象的数据进行交互. 给对象赋予了"黑盒"的特征,提高了重用性 ...