语法

  • Ruby中的类以class开始 以end结束,类名首字母的约定是大写。

  • Ruby中的方法以def开始 以end结束,方法名首字母的约定是小写。

  • Ruby中的局部变量名首字母的约定是小写。

  • Ruby中的构造函数名称为initialize。

  • Ruby中的成员变量(实例变量)前导@符,在initialize里进行声明与初始化。

  • Ruby中的属性用attr_writer和attr_reader声明,分别对应c#的set,get,使用了 attr_accessor是可读也可写

  • Ruby中的全局变量前导$符。

  • Ruby中的常数(常量)用大写字母开头,约定是全部大写。

  • Ruby中任何的表达式都会返回值,

sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Rectangle
  	def initialize(wdth, hgt)
    @width = wdth
    @height = hgt
  	end
  	def width=(wdth)
    @width = wdth
  	end
  
end

r = Rectangle.new(2,3)
puts r.width = 5 #output 5
puts r.width # error! because the width not support read

继续补充下attr_accessor的使用,

sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Rectangle
  	attr_accessor :width
  	attr_accessor :height
  	attr_accessor :width2
  	attr_accessor :height2
  
  def initialize(wdth, hgt)
    @width = wdth
    @height = hgt
  end
  
  def area()
    return @width * @height
  end
  
  def area2()
    return @width2 * @height2
  end
  
  
end

r = Rectangle.new(2,3)
r.width = 5 # give samename's variable value
r.height = 5 
puts r.area() #outputs is 25  

r.width2 = 6 # not samename's variable  create
r.height2 = 6 
puts r.area2() # outputs is 36

上面的代码说明了,在使用attr_accessor的时候,会寻找是否有同名的成员变量,如果有则访问同名成员变量,如果没有会默认创建一个前导@的成员变量

神奇的操作符重载

Ruby支持操作符重载,而且很神奇!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Rectangle
  attr_accessor :width
  attr_accessor :height
  
  def initialize(wdth, hgt)
    @width = wdth
    @height = hgt
  end
  
  def area()
    return @width * @height
  end
  
  def +(addRectangle)
    return self.area + addRectangle.area
  end

end

r1 = Rectangle.new(2,2)
r2 = Rectangle.new(3,3)
puts r1+r2 # operator override
puts r1+(r2)
puts r1.+(r2) # standard function calling format

神奇吧,其实把+号理解为一个函数的名字最好不过了,就像最后一个写法,哈哈。

参数的传递

参数的传递中有默认值与可变长参数两个比较有特点的地方,其他语言有的,ruby也有。

  • 参数的默认值 默认值的设置很简单,与其他语言一样,

sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Rectangle
 attr_accessor :width
 attr_accessor :height
  
 def initialize(wdth = 2, hgt = 2)
    @width = wdth
    @height = hgt
 end
  
 def area()
    return @width * @height
 end

end

r1 = Rectangle.new
puts r1.area

看到了吧,使用默认值了

  • 可选参数,可变长参数

sample

1
2
3
4
5
6
7
8
9
10
11
class ParamSample
  def sayHello(*names)
     puts names.class
     puts "Hello #{names.join(",")}!"
  end
  
end

ps = ParamSample.new
ps.sayHello #output Array Hello !
ps.sayHello("lee","snake") #output Array Hello lee,snake!

可以看出,可变长参数前缀*号,可变长参数的实质是一个Array,呵呵。

类变量以及类方法

sample code

1
2
3
4
5
6
7
8
9
10
11
12
class BankAccount
 @@interestRate = 6.5
 def BankAccount.getInterestRate()
   	@@interestRate
 end
 attr_accessor :balance
 def initialize(bal)
    @balance = bal
  end
end

puts BankAccount.getInterestRate()

以上代码中描述了如何定义类变量以及如何访问类变量

Ruby的成员访问修饰关键字分为三种,与c#一样。

  1. private 只能为该对象所调用的方法

  2. protected 只能为该对象及其子对象所调用的方法

  3. public 可以让任何对象所调用的方法 与c#不同的是,ruby的访问修饰符从定义处开始起作用,直到下一个访问修饰符出现时终止,

比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Greeter
  def initialize
  end
    
  private
  def sayhi()
    puts "hi"
  end
  
  def saybye()
    puts "bye"
  end
  
  public
  def say()
    sayhi
    saybye
  end
  
end

g = Greeter.new
g.say # output hi bye
g.sayhi # error because the sayhi isn't publics member

initialize默认就是private的

其他方法默认是public的 成员变量和类变量默认是private的 要用attr_reader或attr_accessor来增加读写控制