Ruby 学习:绪论与基础语法

什么是 Ruby

Ruby 是一种高级的、面向对象的、动态类型的脚本类型语言。是一种逐渐没落(悲)的 Web 应用开发语言和框架。

Ruby 的开发者是日本人松本行弘。官方文档:Ruby 文档

Ruby 是一门完全面向对象的语言。其语法十分灵活(冗余)。举个例子,你知道循环十次有四种不同的写法吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for i in 1...10
puts "hello world"
end

10.times do
puts "hello world"
end

1.upto(10) do
puts "hello world"
end

(1..10).each do
puts "hello world"
end

在 ruby 中,万物皆对象(我认为比 Java 还要彻底)。连一个简单的整数 10 都是一个对象(10.times 就是调用了对象上的方法)。

ruby 的设计理念是”以人为本”。所以个体使用 ruby 的开发效率会很快。我们可以使用几行代码完成其他语言几十行完成的工作。

Ruby on rails 是什么

Ruby on Rails 是一种流行的,开源的,面向对象的Web开发框架,许多程序员和应用程序提供商都在使用该框架。 它基于模型视图控制器(MVC)方法。

模型映射到数据库,功能映射到应用程序中的对象,例如用户。 Rails为命名和文件目录结构提供了一个标准约定,该约定简化了编程,还提供了自动构建功能的解决方案,称为脚手架。 它还确保了开发人员可以共同工作并从彼此的努力中受益的共同环境。

Rails 哲学包含两大指导思想:

  • 不要自我重复(DRY): DRY 是软件开发中的一个原则,“系统中的每个功能都要具有单一、准确、可信的实现。”。不重复表述同一件事,写出的代码才能更易维护,更具扩展性,也更不容易出问题。
  • 多约定,少配置: Rails 为网页程序的大多数需求都提供了最好的解决方法,而且默认使用这些约定,不用在长长的配置文件中设置每个细节。

基础语法

注释

单行注释

1
# 这是单行注释

多行注释

1
2
3
4
=begin
这是多行注释
以=begin开始,=end结束,=要顶格写
=end

赋值

ruby 中赋值无需声明类型(动态类型),解释器将自行解释变量的类型。

1
2
3
4
say = "hello world"
puts say

x = y = 1

在 ruby 中,任何语句都具有返回值。因此在函数中我们有时可以不写 return,默认返回最后一句话的返回值。

在赋值时,可以同时给多个变量赋值。

1
2
a, b, c = 10, 20, 30 # =>[10, 20, 30]
a, b, c = 1, 2 # a=1, b=2, c=nil

事实上是转换成为了列表然后进行赋值。

控制语句

1
2
3
4
5
6
7
8
x = 5
if x > 5 then
puts "x>5"
elsif x > 0
puts "0<x<=5"
else
puts "x<=0"
end

在 ruby 的真值判断中,只有 nil 类型和 false 代表假。其余都代表真。

条件判断语句可以后置。如:

1
2
3
flag = 1
puts "hello world" if flag == 1
puts "hello world" unless flag != 1

这很符合通常的语言习惯,写起来尊嘟很舒适。

选择语句

在 ruby 中,选择语句的写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 通常的选择
car = "Patriot"
manufacturer = case car
when "Focus" then "Ford"
when "Navigator" then "Lincoln"
when "Camry" then "Toyota"
when "Civic" then "Honda"
when "Patriot" then "Jeep"
else "Unknown"
end

# 区间选择
score = 70
result = case score
when 0..40 then "Fail"
when 41..60 then "Pass"
when 61..70 then "Pass with Merit"
when 71..100 then "Pass with Distinction"
else "Invalid Score"
end

事实上 case 语句是通过比较操作符 ‘case equality’(即 ‘===’)进行判断的。

此操作符不测试通常的相等关系,而是判断二者之间是否拥有 _Is-a_ 关系。即不测试相等性,而测试包容性。一般而言,应当避免显式使用三等号,因为这容易造成混淆。

循环语句

合法的循环方式们:

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
for i in 1..10 do
puts "hello world"
end

for i in 1..10 # do 可以省略
puts "hello world"
end

for i in 1..10 do puts "hello world" end # 可以一行写完

i = 0
while i < 5 do # puts i += 1 until i == 5
puts i
i += 1
end

i = 10
until i < 5 do # puts i -= 1 while i > 5
puts i
i -= 1
end

10.times { puts "hello world" } # 对于固定次数的循环我十分喜欢这种写法
1.upto(10) { puts "hello world" }
10.downto(1) { puts "hello world" }
(1..10).each { puts "hello world" } # 我喜欢使用这个代替 for 循环

引用循环变量:

1
2
3
4
5
6
10.times { |x| puts x }
(1..10).each { |x| puts x }
1.upto(10) { |x| puts x }
10.downto(1) { |x| puts x }
1.step(10, 2) { |x| puts x }
(1..10).step(2) { |x| puts x }

真是十分便捷的写法。

常量与变量

全局变量:以 $ 开头。
对象实例属性:以 @ 开头。
类属性:以 @@ 开头。
本地变量:以小写字母开头。
常量:以大写字母开头

单引号与双引号

单引号括起来的字符串不会解释转义字符,而双引号会。一般在支持单双引号的语言中都是这么约定的。

格式化字符串

有多种办法进行字符串的变量替换。

1
2
3
4
5
6
num = 100
str = "num is #{num}" # num is 100
str = %Q(num is #{num}) # num is 100
str = %(num is #{num}) # num is 100
str = %q(num is #{num}) # num is #{num}
# %q 内被视作单引号,故不会进行变量替换

符号

才写到符号家人们,后面的语法以后再来探索吧。