============================================================================
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