============================================================================ 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
|
请发表评论