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

posted @ 2010-05-31 15:29  chunchill  阅读(411)  评论(0编辑  收藏  举报