Ruby边学边记

Ruby边学边记

该篇主要描述类

Ruby定义一个类

#!/usr/bin/ruby -w
class Customer
    @@no_of_customer = 0
    def hello(id ,name ,addr)
        @cust_id = id
        @cust_name = name
        @cust_addr = addr
    end
end
  • 以@@开始的是类变量
  • 以@开始的是实例变量
  • 以$开始的是全局变量
  • 以小写或者是_开头的是局部变量

创建类的对象

1.对象

类中定义的方法称为类的成员函数。使用new关键字穿件类的对象

如下:

#!/usr/bin/ruby -w
class Customer
    def hello
        puts "Hello World"
    end
end

cust1 = Customer.new
#new 前面也可以有一个空格
cust2 = Customer. new

cust1.hello
cust2.hello

2.initialize方法

initialize函数是类初始化函数,创建对象时会自动调用,并可以通过new 传递参数给initialize方法

#!/usr/bin/ruby -w
class Customer
    @@no_of_customer = 0
    def initialize(name)
        @cust_name = name
    end

    def hello
        puts "Hello #{cust_name}"
    end
end

cust = Customer.new("Nick")
cust.hello

全局变量

1.刚刚已经说过,以$开头的是全局变量,能够跨类使用

#!/usr/bin/ruby       

$global_var = 10        #定义全局变量
class Class1
  def print_global
     puts "Global variable in Class1 is #$global_var."
     #通过在变量或常量的前面放置"#",可以实现对任何变量或常量的访问
  end
end
class Class2
  def print_global
     puts "Global variable in Class2 is #$global_var."
  end
end

class1obj = Class1.new    #创建一个对象
class1obj.print_global    #对象调用成员函数,成员函数调用全局变量
class2obj = Class2.new
class2obj.print_global

实例变量

以@开头;实例变量可以跨任何特定的实例或对象中的方法
例如:

#!/usr/bin/ruby            #文件名为cust.rb

class Customer
   def initialize(id, name, addr)
      @cust_id=id        #定义一个cust_id实例变量
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
                        #访问实例变量
    end
end

类变量

以@@开头,而且需要初始化之后才能在方法定义中使用;类变量属于类,是类的一个属性,同时类变量可以跨不同的对象使用

#!/usr/bin/ruby        #文件名为class_var.rb

class Customer
   @@no_of_customers=0
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
    end
    def total_no_of_customers()
       @@no_of_customers += 1
       puts "Total number of customers: #@@no_of_customers"
    end
end

cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
cust1.total_no_of_customers()
cust2.total_no_of_customers()

局部变量

局部变量是在方法中定义的变量,在方法外不可定义; 局部变量是以小写字母或者下划线 _ 开头的。

就如同上面方法中的id, name, addr


类中的方法

如果你学习过 Java,那么你肯定对私有 (private) 和公有 (public) 不会陌生。

同样 Ruby 也是有 private 和 public 的,而且当方法定义在类定义外时则该方法默认被标记为 private,若在类定义中那么默认标记为 public。

#!/usr/bin/ruby        #文件名为class_fun.rb

class Class_fun            #创建一个Class_fun类
    def fun1
        puts "This is the first test for class."
    end
    def fun2
        puts "This is the second test for class."
    end                #类中包括两个成员函数
end

test1 = Class_fun.new
test2 = Class_fun.new    #创建类Class_fun的两个对象
test1.fun1            #对象调用类的成员函数
test2.fun2

代码块

  • 什么是代码块?

块就是由大量代码组成;

代码包含在大括号do...end 内;块只能跟在方法调用之后,例如你的代码块称为block_test,那就必须定义一个block_test相同名字的方法来调用代码块

  • yield语句

在方法内部,yield的作用是占位,当执行到yield时就是执行代码块中的内容;|x|是在代码块中使用的,用于接受

例如:

#!/usr/bin/ruby        

def block_test
   puts "You are in the method"
   yield                #执行代码块
   puts "You are again back to the method"
   yield                #执行代码块
end

block_test {puts "You are in the block"}

结果:

  • BEGIN和end 块

BEGIN 和 END 块分别定义程序被加载就执行和程序结束时执行的代码块;个人理解可以把这个看成生命周期

#!/usr/bin/ruby        #文件名为be_and_in.rb

BEGIN { 
  #BEGIN 代码块
  puts "BEGIN code block."
}

END { 
  #END 代码块
  puts "END code block."
}
puts "MAIN code."

结果:

运算符

1.在 Ruby 中很多的运算符跟其他语言都是相同的,(比如基本的 +、-、*、/ 算术运算 ,以及 位运算 和 逻辑运算 等)但是还是有一部分是不一样的,下面将对 Ruby 的部分运算符进行操作实验。

2.比较运算符
.eql?:如果原参数与接收到的参数具有相同的类型和值,则返回 true。

范例:

5.eql?(5.0) 返回 false
#equal?:如果原参数与接收到的参数具有相同的对象 id,则返回 true。

3.并行赋值

范例:

a,b,c = 10,20,30
等价于:
a = 10, b = 20, c = 30

4.变量交换

a,b = b,a
#交换了a和b的值,也可以多个变量同时交换

5.三元运算符

a>b ? c=b : c=a
#如果a大于b则将b的值赋给c,否则将a的值赋给c

6.范围运算符

在 Ruby 中有两个范围运算符,分别是 ..和 …

..:表示创建一个从开始点到结束点的范围(包含起始点和结束点)

...:表示创建一个从开始点到结束点的范围(包含起始点但不包含结束点

范例:

1..10
#创建从1到10的范围

1…10
#创建从1到9的范围

7.defined?运算符

defined? 运算符是以调用相关方法的形式来判断传递的参数是否已经定义,如果表达式未定义则返回 nil,如果已定义则会返回参数描述。

范例:

#!/usr/bin/ruby        #文件名为defined.rb
a=100
puts “a is defined?”,defined? a
puts “test is defined?”,defined? test
运行:

$ ruby defined.rb
a is defined?
local-variable
test is defined?

8.点运算符和双冒号运算符

在 Ruby 中类和方法都可以被当做常量来使用 :: 运算符: 可以使用一个模块名称和双冒号来引用一个常量; 双冒号运算符允许在类或模块内定义常量、实例方法和类方法,可以从类或模块外的任何地方进行访问。

范例:

#!/usr/bin/ruby                
CONST = ' out there'            #定义常量

class Inside_one
   CONST = proc {' in there'}     
   def where_is_my_CONST
      ::CONST + ' inside one'    #引用常量
   end
end

class Inside_two
   CONST = ' inside two'
   def where_is_my_CONST
      CONST
   end
end

puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST

若未使用前缀表达式,则默认使用主 Object 类。 Proc 是对块及其 context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Ruby边学边记(二) Ruby模块 模块在Ruby里面有两个作用 把功能相同的方法放在同一个名称之下 方便调用方...
    myserendipit阅读 394评论 1 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • Win7下如何打开DOS控制台? a:开始--所有程序--附件--命令提示符 b:开始--搜索程序和文件--cmd...
    逍遥叹6阅读 1,595评论 4 12
  • 我知你年岁长于我 定然看过许多柔风冷月 秀山清河 我如此愚笨痴傻 竟还是想把所见山川湖泊 一一与你细数 让他们笑我...
    寂木阅读 228评论 6 13
  • 幻想之笔在彩云之巅,指尖飞舞诗意成行。青春在燃烧,年少正旺。梦想种子刚出芽,风中的海燕正在展翅高飞,春草嫩芽正在探...
    青春潇潇雨榭阅读 202评论 0 1