Ruby七天入门(2 函数,数组和类)

DAY 2

第二天学习继续,今天重点学习函数,数组和类等编程的基本要素。

2.1 函数2.1.1 简单定义 def tell_me puts true end定义一个简单的函数(无参无返回值)很简单,使用def end包裹函数体即可。2.1.2 参数def tell_me(a)puts aendtell_me 11=> nil使用参数和其他语言类似,加括号加变量名即可。2.1.2.1 参数默认值

同样可以指定参数默认值:

def tell_me(a=’1′,b)puts aputs bend=> niltell_me 212=> niltell_me 3,434=> nil

我们看到指定默认值的方式跟其他语言类似。

有些苦恼的是,看起来我们需要记住每一个函数的参数数量和含义。

2.1.2.2 可变参数

Ruby同样支持可变参数,而且因为不受类型的限制,使用相当自由:

def test(*tt)for i in 0…tt.lengthputs tt[i]endend=> niltest => 0…2test ‘a’a=> 0…1我们看到只需要将参数前加*即可,收到的参数就将是一个数组。2.1.3 返回值2.1.3.1 默认返回值昨天的学习里看到过,其实所有的Ruby语句都有返回值,那么其实我们及时不给函数指定返回值,函数也会返回他执行的最后一个语句的值。 看下面的例子:def give_metrueend=> nili=give_me=> truei=> true

这个函数我们并没有指定返回值,但是函数还是返回了最后执行的语句true的值。

2.1.3.2 return语句$ irbdef testa=1b=2return a,bend=> nilvar=test=> [1, 2]var.class=> Arrayvar=> [1, 2]

Ruby可以通过return语句指定返回值,而且跟C家族语言不同的是,Ruby可以同时返回多个返回值。

因为动态语言的特性,Ruby看起来如此自由,,但是看起来这就更要求调用者对他们的调用负责。

2.2 代码块和yield2.2.1 代码块的使用

代码块是没有名字的函数。

3.times{puts ‘hi’}times是Fixnum类的方法,它可以执行后面的代码块n次。后面大括号中内容就是代码块,代码块既可以用{}来包裹,也可以用do/end来包裹,就像下面的的代码。3.times doputs ‘hello’end

昨天在区间一节中提到的each函数后面其实也是代码块:

names=[‘lee’,’tom’,’jim’]names.each{|a| puts a}2.2.2 yield执行代码块

下面我们来看下自定义的方法来执行代码块:

def my_times(i=5)=i-1yieldendendmy_times(3){puts ‘a’}

我们看到这个函数根据传入参数,调用了一定数量的代码块。 – 函数中定义的yield表示执行代码块中的代码。

2.2.3 代码块作为函数参数

我们也可以将代码块作为参数一直传递下去。

def call_block(&block)block.callenddef pass_block(&block)call_block(&block)endpass_block{puts ‘hello’}在Ruby中,参数名之前加一个“&”,表示将代码块作为闭包传递给函数。闭包就是把函数以及变量包起来,使得变量的生存周期延长。2.3 数组animals = [‘lions’, ‘tigers’, ‘bears’]puts animals[1]puts animals[-1]puts animals[0..1]上面这段代码有个语法糖,-1表示返回倒数第一个元素;当然1和其他语言一样,表示第二个元素animals[0..1]用了昨天学过的区间,表示从0到1个元素irb(main):002:0> [].class=> Arrayirb(main):003:0> a =[]=> []irb(main):004:0> a[1]=> nilirb(main):005:0> b[1]NameError: undefined local variable or method `b’ for main:Objectfrom (irb):5from /usr/bin/irb:12:in `<main>’irb(main):006:0> a[1] = 1=> 1irb(main):007:0> a[0] = ‘zero’=> “zero”irb(main):009:0> a[2]=[‘2′,’3’,[4,5]]=> [“2”, “3”, [4, 5]]irb(main):010:0> a=> [“zero”, 1, [“2”, “3”, [4, 5]]]irb(main):011:0> a[2][2]=> [4, 5]irb(main):012:0> a[2][2][1]=> 5irb(main):021:0> a=[]=> []irb(main):022:0> a[1]=8=> 8irb(main):023:0> a[3]=6=> 6irb(main):024:0> a=> [nil, 8, nil, 6]

比起大多数语言的数组,Ruby的数组使用很自由,从上面这些代码可以看出来。

irb(main):025:0> a.push(4)=> [nil, 8, nil, 6, 4]irb(main):026:0> a.pop=> 4irb(main):027:0> a=> [nil, 8, nil, 6]

数组同样支持push和pop,栈顶位于数组尾部。

2.4 散列表若不给自己设限,则人生中就没有限制你发挥的藩篱。

Ruby七天入门(2 函数,数组和类)

相关文章:

你感兴趣的文章:

标签云: