一.基本概念
1. 类
类是用来表示实际世界中的实体,是状态和使用这些状态的方法的组合
2.实例
一个类的具体实现,跟对象,类的实体等同含义
3.构造函数
ruby中通过调用构造函数来创建对象,是一种特殊的方法,我们称构造函数为new,比如:
song1=Song.new("ruby tuesday");
song2=Song.new("tomorrow");
4.方法调用
“he is a girl”.length
-190.abs
点号之前称为接收者,后面的称为被调用的方法。第一个例子用来求一个字符串的长度,第二行代码用来求一个数字的绝对值。ruby和其他语言有一个很大的区别,比如java中,是通过调用另外一个函数来获取一个数字的绝对值,然后将返回值赋给数字自己(number=Math.abs(number) )。而ruby中,求绝对值的能力是内建在数字中的,只需要发送abs消息给一个数字对象,数字对象就会去求绝对值了。所以说ruby是一门真正的面向对象语言
二. 基础知识
2.1 先来一个简单的例子
def say_goodnight(name)
result="good night,"+name
return result
end
#say goodnight
puts say_goodnight("liwenshui")
puts say_goodnight("liwen")
1. 每个语句在单独的行上,无需分号分割
2. #号开始的行为注释行
3. 方法是用def定义,方法体没有方括号,end用来表示方法的结束
4. 局部变量使用无需先定义,比如result变量赋值给它的时候,他就存在了
5. 字面量定义字符串,可以单引号也可以双引号,如果单引号,那就是字面量,如果双引号,会寻找转移字符等。比如puts "good \n tx",会换行,其二,表达式内插,前面的方法可以写成如下形式
def say_goodnight(name)
result="good night,#{name}"
return result
end
#{...}花括号里面可以是复杂的表达式,比如:
def say_goodnight(name)
result="good night,#{name.capitalize}"
return result
end
puts say_goodnight('uncle')的输出结果为 good night Uncle。
如果表达式是一个全局变量或者实例变量,花括号可以省略,如下所示
$greeting="Hello"
@name="predunce"
puts '#$greeting,#@name'
2.2 命名惯例
1.局部变量,方法参数和方法名称小写字母或者下划线开始
2.全局变量$为前缀,实例变量@,类变量2个@
3.类名称,模块名称,常量大写字母开始
2.3 数组和散列表
数组定义:
a =[1,'cat',3.14]
a[0]
a[1] =nil
数组方括号包含,里面可以是三种类型(整数,字符串,浮点数),nil在ruby中表示没有任何东西的对象,和其他语言不同,其他语言表示没有对象。
定义一个数组需要很多逗号和引号,%w可以解决,如下所示
a=['dog','cat','ant','bee']
等价于
a=%w{dog,cat,ant,bee}
散列表定义:
inst_section= {
'cello' =>'String',
'drum'=>'percussion',
'oboe'=>'brass'
}
inst_section['oboe'] ->brass
inst_section['oboes'] ->nil
2.4 控制结构
if或者while循环,没有花括号,end用来表示程序体的结束
count = 99
if count > 10
puts "Try again"
elsif tries == 3
puts "You lose"
else
puts "Enter a number"
end
如果if或者while语句的程序体只是一个表达式,ruby语句修饰符是一种有用的快捷方式
radiation = 1
puts "Danger, Will Robinson" if radiation > 3000
2.5 Block
block,一种可以和方法调用相关联的代码块,几乎就像参数一样。是定义在花括号或者do...end之间的一组代码,一行就在花括号里,多行就在do...end中间。
animals = %w( ant bee cat dog elk ) # create an array
animals.each {|animal| puts animal } # iterate over the contents
参数用两个竖线表示,如果多个参数,逗号分割。
def call_block
puts "Start of method"
yield
yield
puts "End of method"
end
call_block { puts "In the block" }