11年软件老兵说Ruby:对程序员最友好且可读性最强的语言

299 查看

命名规则
常量

全都是大写字母.ANDROID_SYSTEM = 'android'

变量

如果不算@, @@, $的话,是小写字母开头.下划线拼接.例如: color, age, is_created

class, module

首字母大写,骆驼表达法: Apple, Human

方法名

小写字母开头. 可以以问号? 或者等号结尾,例如: name, created?, color=

Class 的写法

作为面向对象语言, class毫无疑问是最重要的. Ruby中的任何变量都是 object. (不像java, int 是基本数据类型, Integer才是 class.)

具体的写法:

  • 名字首字母大写
  • class 开头, end 结尾.
  • 文件名字与class名称一样.只是改为: 下划线 + 小写.
Class的例子

class Apple

  # 这个方法就是在 Apple.new 时自动调用的方法
  def initialize
    # instance variable, 实例变量
    @color
  end

  # getter 方法
  def color
    return @color
  end

  # setter 方法
  def color= color
    @color = color
  end

  # private 下面的方法都是私有方法
  private
  def i_am_private
  end
end

red_apple = Apple.new
red_apple.color = 'red'
puts "red_apple.color: #{red_apple.color}"

我们来运行这个文件:


$ ruby apple.rb
# => "red_apple.color: red"

上面的例子是java/c风格的. ruby的熟手一般这么写:


class Apple
  # 这一句,自动声明了 @color, getter,setter
  attr_accessor 'color'
end
变量

类变量: class variable, 例如: @@name, 作用域:所有的多个instance 会共享这个变量. 用的很少.

实例变量 instance variable, 例如: @color, 作用域仅在instance之内

普通变量: local variable, 例如: age = 20, 作用域仅在 某个方法内.

全局变量: global variable, 例如:$name = "Jim", 作用域在全局. 用的更少.

下面是一个例子:


class Apple

  @@from = 'China'

  def color = color
    @color = color
  end

  def color
    return @color
  end

  def get_from
    @@from
  end

  def set_from from
    @@from = from
  end
end

red_one = Apple.new
red_one.color = 'red'
puts red_one.color
# => 'red'
red_one.set_from 'Japan'
puts red_one.get_from
# => 'Japan'

green_one = Apple.new
green_one.color = 'green'
puts green_one.color
# => 'green'
puts green_one.get_from
# => 'Japan'
方法:类方法(class method)与实例方法(instance method)

用法上, 看这个例子:


class Apple
  # 类方法
  def Apple.name 
    'apple'
  end

  # 实例方法
  def color
    'red'
  end
end

Apple.new.color
# => red

Apple.name
# => apple
Symbol: 不变的字符串

前面的apple.rb例子中, 正常的应该写成:

class Apple
  attr_accessor :color
end

这个 :color 是什么呢? 就是Symbol. 它是不会变化的字符串.
内容永远不变. 等同于一个常量.

特别适合做hash 的key.

大量被用到.

:name 等同于: "name".to_symbol
字符串插值

在Ruby中,我们最好所有的地方都用字符串插值(interpolition) ,避免使用 + 方式. 原因是:对于不同的数据类型,用+号时,系统会报错.

使用字符串插值时,记得用双引号.


puts "hi, #{name}!"
# => hi, jim
你也可以把它写成:

puts "hi, "+ name
# => hi, jim
如果用加号,一些时候就会报错:

a = 1
puts "a is: " + a
# => 报错

puts "a is: #{a}"
# => a is: 1
hash: 同一个hash 的三种写法

任何情况下都生效的语法: =>


jim = {
    :name => 'Jim',
    :age => 20
}

Ruby 1.9之后产生的语法:更加简洁.


jim = {
    name: 'Jim',
    age: 20
}

也可以写成:


jim = {}
jim[:name] = 'Jim'
jim[:age] = 20

但是, symbol 与 string , 是不同的key, 例如:


a = {:name => 'jim', 'name'=> 'hi'}
a[:name]  #=>  'jim'
a['name'] #=>  'hi'
条件语句
if else end 是最常见的

a = 1
if a == 1
  puts "a is 1"
elsif a == 2
  puts "a is 2"
else
  puts "a is not in [1,2]"
end
case when end 分支语句

a = 1
case a
  when 1 then puts "a is 1"
  when 2 then puts "a is 2"
  when 3,4,5 then puts "a is in [3,4,5]"
  else puts "a is not in [1,2,3,4,5]"
end
三元表达式

a = 1
puts a == 1 ? 'one' : 'not one'
# => one
循环:for, each, loop, while

使用原则: 哪个可读性强就用哪个

for, each (前者是关键字,后者是普通方法)

[1,2,3].each { e
  puts e
}

# 等同于下方: 
for e in [1,2,3]
  puts e
end

for 与 each 都可以做循环,但是高手都用each.

区别在于:for 是关键字, each是方法. for 后面的变量,是全局变量,不仅仅存在于for .. end 这个作用域之内.


for i in [1,2,3]
  puts i
end
puts i  # => 3

loop与while是几乎一样的.


loop do
  # your code
  break if <condition>
end

begin
  # your code
end while <condition>

但是ruby的作者推荐使用loop. 因为可读性更强. 下面是一个例子


a = [2,1,0,-1,-2]
loop do
  current_element = a.pop
  puts current_element
  break if current_element < 0
end

# => 2
# => 1
# => 0