一.
数组
数组的创建 names = ["shiwanyin","jingshang","dapao","xishuai"]
数组对象 数组对象未确定时,用[]表示一个空数组对象。
从数组中抽取对象 names[0]
print "第一个名字为:",names[0],"。\n"
将对象保存到数组中 支持多种不同对象的混合保存。
数组的大小
array.size
数组的循环
names.each do |变量|
希望循环的处理
end
15散列类
15.1复习散列
15.2散列的创建
15.2.1使用{}
{键=>值}
像下面那样指定键值对,键值对之间用逗号,隔开
h1 = {"a"=>"b","c"=>"d"}
p h1["a"] #=>"b"
用符号作为键时
{键:值}
h2 = {a:"b",c:"d"}
p h2 #=>{:a=>"b",:c=>"d"}
15.2.2使用Hash.new
用来创建新的散列的方法。
指定参数值返回
15.3 值的获取与设定
与数组一样,散列也是用[]来实现与键相对应的元素值的获取与设定的。
h = Hash.new
h["R"] = "Ruby"
p h["R"] #=>"Ruby"
还可以用store方法设定值,用fetch方法获取值。下面的例子的执行结果与上面的例子是一样的。
h = hash.new
h.store("R","Ruby")
p h.fetch("R") #=>"Ruby"、(如果散列中不存在指定的键,程序就会发生异常)
对fetch方法指定第二个参数,那么该参数值就会作为键不存在是散列的默认值。
h = Hash.new
p h.fetch("N"){String.new} #=>""
15.3.1
一次性获取所有的键值。由于散列是键值对形式的数据类型,因此获取键值的方法是分开的。
h = {"a" = "b","c" = "d"}
p h.keys #=>["a","c"]
p h.values #=>["b","d"]
p h.to_a #=>[["a","b"],["c","d"]]
除了返回数组,使用迭代器获取散列值。
Number无需声明
字符串类
14.1字符串的创建
str1 = "字符串";str2 = '字符串'。
使用“”时可以执行用#{}括起来的Ruby式子。 这个#{}就称为内嵌表达式。
14.1.1 %Q和%q
创建包含“‘的字符串,使用%Q或者%q会比使用\" \'更简单
desc = %Q{Ruby的字符串中也可以使用’‘和”“} %Q相当于用“”创建字符串
str = %q|Ruby said, 'Hello world' %q相当于用‘’创建字符串
14.1.2
使用Here Document
Here Document 是源自于Unix的shell的一种程序写法。
使用<<创建字符串(创建包含换行的长字符串时这个方法是最简单的)
<<"结束标识符"
字符串内容
结束标识符
<<后面的结束标识符可以用“”括着的字符串(转义字符和内嵌表达式)或者用‘’括着的字符串定义(原封不动的显示)。
Here Document 的结束标识符一定要在行首。在程序缩进较深的地方会出现缩进乱掉的情况。
使用<<- 代替 <<,忽略掉结束标识符前的空格和制表符。结束标识符就没有必要写在行首。
range类
r1=1..5 #定义范围对象r1,包括元素1,2,3,4,5
r2=Range.new(1,5) #等价与1..5
r3=1...5 #定义范围对象r3,包括元素2,3,4
r4=Range.new(1,5,true) #等价与1...5
二。循环
1. times方法
在前面已经有提到过了,语法如下:
复制代码 代码如下:
循环次数.times do 循环次数.times {
重复执行的动作 重复执行的动作
end }
#也可以在times模块中加入变量
5.times { |i|
print "This is the", i+1, " time. \n"
}
# i变量是从0开始计算的
2. for 语句
复制代码 代码如下:
语法:
for 变量 in 开始数值..结束数值 do
反复执行的动作
end
# do是可以省略的
from = 0
to = 20
sum = 0
for i in from..to
sum += 1
end
语法:
for 变量 in 对象
反复执行的动作
end
names = ["Windy", "Cindy", "Jack", "Hugo"]
for name in names
print name, " likes Ruby. \n"
end
第二个语法的for语句,与java中的for each语句非常类似,for (i in list?) {...}
3. while 语句
while语句与JAVA中也是类似的
复制代码 代码如下:
语法:
while 条件 do
反复执行的动作
end
a = 1
sum = 0
while a <10 do
sum += a
i += a
end
4. until 语句
其语法与while语句类似,只是只有条件不符合的时候,才会反复执行循环
复制代码 代码如下:
语法:
until 条件 do
反复执行的动作
end
# do可以省略
sum = 0
until sum >50
sum += 1
end
print sum
# 以上until循环可以转换成下面的while循环
while !(sum >50)
sum += 1
end
5. each 方法
在前面已经提到过这个方法了,这里就简要记录下语法
复制代码 代码如下:
对象.each { |变量|
想要反复执行的动作
}
6. loop方法
它是一种没有结束条件的方法,只是不断进行循环处理,示例如下:
复制代码 代码如下:
loop {
print "Ruby"
}
三。运算符
算术运算符+-*/ 取余% 平方**
比较运算符 >,<,==,!=,>=,<=,===,<=>,.eql?,equal?(区别最后两个) 前者是判断两个数值是否相同,后者是判断是否为同一个数,如果不懂可以继续追问我。
四。正则表达式 这一部分应该是ruby的特色,建议你好好学学。推荐这个地址给你
http://www.runoob.com/ruby/ruby-regular-expressions.html
纯手打
Ruby是一个完美的面向对象编程语言。拥有面向对象的编程语言的功能,包括:1、数据封装
2、数据抽象
3、多态性
4、继承
这些功能已在讨论面向对象Ruby
面向对象的程序涉及类和对象。 一个类是蓝本,从个别对象被创建。在面向对象的术语,我们说小明的自行车是被称为自行车类的对象实例。
任何车辆的例子。它包括轮子,马力,燃油或燃气罐容量。这些特点形成的类车辆的数据成员。可以从其他车辆区分这些特征。
车辆也有一定的功能,如停止,驾驶,超速驾驶。即使这些功能形成的类车辆的数据成员。因此,可以定义一个类作为一个组合的特点和功能。
车辆类可以被定义为:
Class Vehicle
{
Number no_of_wheels
Number horsepower
Characters type_of_tank
Number Capacity
Function speeding
{
}
Function driving
{
}
Function halting
{
}
}
通过这些数据成员分配不同的值,可以形成类车辆的几个实例。例如,飞机的有三个轮子,1,000马力,不同的燃料罐及容量为100升。同样的方式,一辆汽车有四个轮子,200马力,气体作为不同的罐及容量25升。
Ruby中定义一个类:
要通过使用Ruby实现面向对象编程,需要先学习如何创建对象和Ruby中的类。
Ruby中一个类总是以关键字class类的名称开头。名称应始终以首字母大写。如以是Customer类可以显示为:
class Customer
end
类定义结束通过使用关键字end结束。在类的所有数据成员是类之间的定义,并以end关键字作为结束符。
Ruby类中的变量:
Ruby提供了四种类型的变量:
局部变量: 局部变量是在一个方法中定义的变量。局部变量是不可用的方法外。更多细节在随后的章节中的方法中会介绍。局部变量一般以小写字母或_开头。
实例变量: 实例变量是可跨越任何特定实例或对象的方法。这意味着,从对象到对象的实例变量改变。实例变量前面加上at符号(@),跟着变量名。
类变量:类变量是可在各种不同的对象。 一个类变量属于类,是类的一个特点。他们前面的符号@@跟着的变量名。
全局变量: 类变量是不能跨类。如果想要一个单一的变量可以跨类,需要定义一个全局变量。全局变量的前面总是用美元符号($)。
例子:
使用类变量@@no_of_customers,能确定创建的对象的数量。这使得导出的客户数量。
class Customer
@@no_of_customers=0
end
Ruby中使用new方法创建对象:
对象是类的实例。现在,将学习如何在Ruby中创建对象一个类对象。Ruby中通过使用new方法创建对象。
new方法是一种独特的方法,这是预定义在Ruby库。new方法属于类的方法。
下面的例子是创建两个对象类客户cust1 和 cust2:
cust1 = Customer. new
cust2 = Customer. new
在这里,cust1和cust2是两个对象的名字。在等于号(=)之后,类名称将按照对象名称。然后,点运算符和关键字new在后面。
自定义方法来创建Ruby对象 :
可以通过new方法的参数,这些参数可以用来初始化类变量。
当打算声明的new方法具有参数,需要声明的方法在创建类的时候初始化。
initialize方法是一种特殊类型的方法,该方法时将执行new方法的类被称为参数。
下面的例子是创建initialize方法:
class Customer
@@no_of_customers=0
def initialize(id, name, addr)
@cust_id=id
@cust_name=name
@cust_addr=addr
end
end
在这个例子中,可以声明局部变量的初始化方法id, name和addr。这里def 结束被用来定义一个Ruby的方法初始化。这些将在有关后续章节中了解更多。
在initialize方法中,对这些局部变量的值传递到实例变量@cust_id,@cust_name和@cust_addr。这里的局部变量持有的值由new方法一同传递。
现在可以创建对象,如下所示:
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
Ruby中类的成员函数:
在Ruby中,函数被调用的方法。在一个类中的每个方法的方法名用关键字def开始。
方法名总是以小写字母最好。你最终的方法Ruby中通过使用关键字end表示结束。
下面的例子是定义一个Ruby的方法:
class Sample
def function
statement 1
statement 2
end
end
这里statement1和statement2为函数体的一部分。这些statments可以是任何有效的Ruby语句。例如,我们可以在方法中打印Hello Ruby如下:
class Sample
def hello
puts "Hello Ruby!"
end
end
现在,在下面的例子Sample类创建一个对象,并调用hello方法,看到的结果:
#!/usr/bin/ruby
class Sample
def hello
puts "Hello Ruby!"
end
end
# Now using above class to create objects
object = Sample. new
object.hello
这将产生以下结果:
Hello Ruby!
你要传入方法,是为了执行吗?ruby可以动态执行,有3种方式,1.
使用send方法
第一种实现动态方法调用是使用send方法,send方法在Object类中定义,方法的第一个参数是一个符号用来表示所要调用的方法,后面则是所调用方法需要的参数。
“This
is
a
dog1″.send(:length)
=>
14
上面的代码中通过send方法去对一个字符串执行length操作,返回字符串的长度。
class
TestClass
def
hello(*args)
”Hello
”
+
args.join(‘
‘)
end
end
a
=
TestClass.new
puts
a.send
:hello,
“This”,
“is”,
“a”,
“dog!”
执行结果为:
Hello
This
is
a
dog!
2.
使用Method类和UnboundMethod类
另一种实现动态方法调用是使用Object类的method方法,这个方法返回一个Method类的对象。我们可以使用call方法来执行方法调用。
test1
=
“This
is
a
dog1″.method(:length)
test1.call
=>
14
class
Test
def
initialize(var)
@var
=
var
end
def
hello()
”Hello,
@var
=
#{@var}”
end
end
k
=
Test.new(10)
m
=
k.method(:hello)
m.call
#=>
“Hello,
@iv
=
99″
l
=
Test.new(‘Grant’)
m
=
l.method(“hello”)
m.call
#=>
“Hello,
@iv
=
Fred”
可以在使用对象的任何地方使用method对象,当调用call方法时,参数所指明的方法会被执行,这种行为有些像C语言中的函数指针。你也可以把method对象作为一个迭代器使用。
def
square(a)
a*a
end
mObj
=
method(:square)
[1,
2,
3,
4].collect(&mObj)
=>
[1
4
9
16]
Method对象都是和某一特定对象绑定的,也就是说你需要通过某一对象使用Method对象。你也可以通过UnboundMethod类创建对象,然后再把它绑定到某个具体的对象中。如果UnboundMethod对象调用时尚未绑定,则会引发异常。
class
Double
def
get_value
2
*
@side
end
def
initialize(side)
@side
=
side
end
end
a
=
Double.instance_method(:get_value)
#返回一个UnboundMethod对象
s
=
Double.new(50)
b
=
a.bind(s)
puts
b.call
执行结果为:
100
看下面一个更具体的例子:
class
CommandInterpreter
def
do_2()
“This
is
2\n”
end
def
do_1()
“This
is
1\n”
end
def
do_4()
“This
is
4\n”
end
def
do_3()
“This
is
3\n”
end
Dispatcher
=
{
?2
=>
instance_method(:do_2),
?1
=>
instance_method(:do_1),
?4
=>
instance_method(:do_4),
?3
=>
instance_method(:do_3)
}
def
interpret(string)
string.each_byte
{|i|
Dispatcher[i].bind(self).call
}
end
end
interpreter
=
CommandInterpreter.new
interpreter.interpret(’1234′)
执行结果为:
This
is
1
This
is
2
This
is
3
This
is
4
3.
使用eval方法
我们还可以使用eval方法实现方法动态调用。eval方法在Kernel模块中定义,有多种变体如class_eval,module_eval,instance_eval等。Eval方法将分析其后的字符串参数并把这个字符串参数作为Ruby代码执行。
str
=
“Hello”
eval
“str
+
‘
World!’”
=>
Hello
World!
sentence
=
%q{“This
is
a
test!”.length}
eval
sentence
=>
15
当我们在使用eval方法时,我们可以通过eval方法的第二个参数指明eval所运行代码的上下文环境,这个参数可以是Binding类对象或Proc类对象。Binding类封装了代码在某一环境运行的上下文,可以供以后使用。
class
BindingTest
def
initialize(n)
@value
=
n
end
def
getBinding
return
binding()
#使用Kernel#binding方法返回一个Binding对象
end
end
obj1
=
BindingTest.new(10)
binding1
=
obj1.getBinding
obj2
=
BindingTest.new(“Binding
Test”)
binding2
=
obj2.getBinding
puts
eval(“@value”,
binding1)
#=>
10
puts
eval(“@value”,
binding2)
#=>
Binding
Test
puts
eval(“@value”)
#=>
nil
可以看到上述代码中,@value在binding1所指明的上下文环境中值为10,在binding2所指明的上下文环境中值为Binding
Test。当eval方法不提供binding参数时,在当前上下文环境中@value并未定义,值为nil。