ruby 学习精简笔记

============================================================================

1、控制器中的方法可以相互调用吗

2、控制方法中定义的@变量是不是实例变量,它貌似只能在控制器方法对应的view中应用,不能被其他view使用

3、text_field等的传值方式,表单的传值方式

4、activeRecord的关系映射

============================================================================

ruby中的代码每个语句放在单独的行数,不需要在每个句子的末尾加上分号

ruby的变量不需要预先声明,可以在使用的时候直接赋值,根据赋值的类型确定变量类型

ruby字符串中含有表达式或者变量用#{表达式},如果是全局变量或实例变量则可以不用花括号

$greeting="helllo"

@name="prudence"

puts "#$greeting,#@name"

方法以def...end的形式表示

ruby方法所返回的值,是最后一个被求值的表达式的值,可以省略return.

ruby使用一种命名惯例来区分名称的用途:名称的第一个字符显示这个名称如何使用,

局部变量、方法参数和方法名称都必须使用小写或者下划线,全局变量都用美元符号($)为前缀;

而实力变量以at(@)符号开始,类变量则以两个@符号开始。最后,类名称、模块名称和常量都必须一个大写的字母开始。

名称可以是字母、数字、下划线的任意组合,但是在@符号之后的不能是数字。按惯例,包含多个单词的实例变量名称在词与词

之间用下划线,包含多个单词的类变量名称用混合大小写。方法名称可以以?、!、=字符结束。

数组:a=[1,2,3] a[0]=1,

a=%wi am ok a[0]="i" a[1]="am" a[2]="ok"

散列表:a={"1"=>1,"2"=>2,"3"=>3} a["1"]

控制语句:如果只是简单的if或者while控制语句,例如只有一句,则可以先写出表达,然后再写if或者while

如:puts "ok" if 3>2

ruby 的一个特性:block和迭代器

block是一个代码块可以和方法相关联,几乎和参数一样

block只是在花括号和do...end之间的一组代码。

{puts "hello"} #this is a block

或者

do

puts "hello"

end

惯例多行用do...end,单行用{},一旦创建了block,就可以和方法相关联。吧block得到开始放在含有方法调用的源码的结尾处,就可以实现

和方法的关联。比如下面的代码:

greet{puts 'hi'}

如果方法有参数:

greet("jim"){puts 'hi'}

使用ruby的yield语句,方法可以一次或者多次地调用相关联的block,可以把block想象或者比作方法调用,它调用yield语句的方法所关联的block.

def call_block

puts "starts of method"

yield

yield

puts "end of method"

end

call_block {puts "in the block"}

结果:

starts of method

in the block

in the block

end of method

看到了吧,block中的代码随着yield的出现而得到调用。当然,我们还可以给yield提供参数,参数会传递到block中。在block中,竖线|之间给出参数名来接受这些来自yield的参数.

def call_block

yield("hello",99)

end

call_block{|str,num| ...}

ruby库中使用大量的block来实现迭代器,迭代器是从某种(collection)如数组中返回元素的方法

animals=%w(ant bee cat dog elk)

animals.each {|e| puts e}

看了上面block和yield的使用不难推理出each实际上是这样的一个方法:

def each

for each element #伪代码

yield(element)

end

end

5.times{puts "*"}

1.upto(6){|i| puts i.to_s}

定义方法:

def ...end

ruby可以让你指定方法参数的默认值-如果调用者在传入参数时没有明确的

ruby可以让你指定方法的参数的默认值---如果调用者在传入参数时候没有明确指定所用的值,为此你可以使用复制操作符:

def cool_dude(arg1="Miles",arg2="Coltrane",arg3="Roach")

"#{ag1},#{ag2},#{ag3}."

end

cool_dude

cool_dude("Bart")->Miles,Coltrane,Roach

cool_dude("Bart","Elwood")->Bart,Coltrane,Roach

cool_dude("Bart","Elwood","Linus")->Bart,Elwood,Linus

可变长度的参数列表

def varags(arg1,*rest)

"Got #{arg1} and #{rest.join(',')}"

end

varags("one")->got one and two

varags("one","two","three")->got one and two,three

如果方法的最后一个参数是&,那么所关联的block会转换成一个Proc对象,然后赋值给这个参数。

class TaxCalculator

def initialize(name,&block)

@name,@block=name,block

end

def get_tax(amount)

"#@name on #{amount}=#{@block.call(amount)}"

end

end

tc=TaxCalculator.new("Sales tax"){|amt| amt*0.75}

tc.get_tax(100) #->Sales tax on 100=7.5

tc.get_tax(250) #->Sales tax on 250=18.75

方法可以返回多个值,返回多个值则是以数组的形式组织的

def meth_three

100.times do |num|

square=num*num

return num,square if square>1000

end

end

meth_three ->[32,1024]

num,square=meth_three ->num=32,square=1024