1.Ruby是一個面向對象的(object-oriented)的編程語言.
Ruby中所有的操作元都是對象(object).
類(Class),方法(method),實例(instance),對象(object, class instance), constructor, instance variable, instance method, –當自然語言學家遇上程序語言…
method實例:
"dave".length
line_item_one.quantity
-1942.abs
cart.add_line_item(next_purchase)
2.命名
局部變量,method參數和method名以小寫字母或下劃線開頭.實例變量以@號開頭.多單詞名最好以下劃線分隔單詞
實例: line_item
Class名,module名,常量以大寫字母開頭. 最好以大寫字母分隔不同單詞.如: PurchaseOrder
Symbols如: redirect_to :action => "edit", :id => params[:id]
用來指定值. ???
3.Method
實例:
def say_goodnight(name)
result = "晚安, " + "#{name.capitalize}"
return result
end
#該道別了…
puts say_goodnight("小李")
puts (say_goodnight("王老闆"))
Ruby語句每句一行,每行結束不用任何符號
+可以用來連接字符串
注釋語句以#開頭
使用def定義method
puts method用來調用method,將結果顯示在平台上.
雙引號字符串內的轉意字符(如
)和變量名(上面的#{name}及其method capitalize())將被解釋,單引號內字符串則不被解釋.
Ruby自動返回method中最後一個表達式的值. 上method等於:
def say_goodnight(name)
"晚安, #{name.capitalize}"
end
puts say_goodnight("小李")
4.Class
class Order < ActiveRecord::Base
#class 類名 < 子model ::主class名 (定義聲明和從屬聲明)
has_many :line_items
def self.find_all_unpaid
#使用 self.前綴,定義class method (相對於instance method)
#可在程序中任意調用Order.find_all_unpaid
find(:all, ‘paid = 0′)
end
def total
#定義instance method
#調用時應用到實例對象上
#如puts "總數是#{order.total)",注意這個小寫的order
sum = 0
line_items.each {|li| sum += li.total}
end
end
關於instance變量
class Greeter
def initialize(name)
@name = name
# instance變量以@開頭
#變量@name只能在類內調用
end
def say(phrase)
puts "#{phrase},#{@name}"
end
end
g1 = Greeter.new("小李")
g2 = Greeter.new("王老闆")
g1.say("好啊") #=> 老啊,小李
g2.say("早啊") #=> 早啊,王老闆
如要將Greeter里的name在外部調用,要用以下方法:
Class Greeter
def initialize(name)
@name = name
end
def name
@name
end
def name=(new_name)
#???
@name = new_name
end
end
g = Greeter.new("小李")
puts g.name #=>小李
g.name = "王老闆"
puts g.name #=> 王老闆
方便實現上面功能的代碼:
class Greeter
attr_accessor :name #可讀可寫
attr_reader :name #只可讀
attr_writer :name #只可寫
Private和Protected
Private methods只能在同instance內調用
Protected methods除了可在同instance內調用, 也可在類或子類內調用
5.Module
Module和Class類似,是一個常量,method,module和class集. 不同的是不能用Module來創建object.
Module的作用:
1.產生namespace
2.分享class間的功能,沒繼承效果
多個class可以共用一個module,一個class也可使用多個module.
Rails還使用module產生helper method, 輔助應用到view.
6. Array 和Hash
Array和Hash 都是一個數組. Array的索引是整數, 而Hash的索引可以是object. Array的效率相對比Hash高.
Array和Hash都可包含不同類型的變量
Array實例:
a = [1, '狗狗', 3.14] #新數組
a[0] #調用(1)
a[2] #調用(nil, 在Ruby中nil是一個object,指代nothing)
#只有nil和false才等同於邏輯"否". 0為true
又一實例說明<<的用法:
ages = [] #定義新數組
for person in @people
ages << person.age #<<將數值追加到數組中去
end
又又一個實例說明自動生成單詞數組的用法:
a = ['ant', 'bee', 'cat', 'dog', 'elk']
a = %w{ ant bee cat dog elk }
Hash實例:
inst_section = {
:高手 => ‘小張’,
:新來的 => ‘小李’,
:老闆 => ‘王老闆’
}
#調用
inst_section[:高手] #=>’小張’
inst_section[:最討厭的] #=>nil
左邊的symbols是索引,右邊的是值,索引不能重複
值可以另一個array或hash
當hash是method的最後一個參數時,可以省略括號,如:
redirect_to :action => ‘show’, :id => product.id
7.流控制
if實例:
if count > 10
puts "再來一次"
elseif
"你輸 了"
else
"輸入一個數字"
end
while實例:
while weight < 100 and num_pallets <= 30
pallet = next_pallet()
weight += pallet.weight
num_pallets += 1
end
表達式簡化式實例:
puts "早上好" if time < a
8.正則表達式
寫法 /pattern/ 或 %r{pattern}
用法實例:
if line =~ /P(erl|ython)/ #用這個來查找匹配
puts "這個不怎麼樣吧?"
end
正則小例:
/ab+c/ a跟着多個或一個b,後面接c
9.Block 和 Iterator
一行的Block實例:
{ puts "你好" }
多行的Block實例:
do
club.enroll(person)
person.socialize
end
Block的用法實例:
greet { puts "嗨" }
放在method後,如有參數,block放到參數後,如:
verbose_greet("王五","老闆") { puts "嗨" }
iterator is a method that returns successive elements from some kind of collection, such as an array.
Block 和 Iterator聯合使用實例:
animals = %w( ant bee cat dog elk )
animals.each { |animal| puts animal }
#animals.each會yield出後面的block. 本身的值會經|animal|傳給block.
所有的整數帶有times() method, 使用:
3.times { print "哇! " }
10.意外處理
begin
content = load_blog_data(file_name)
rescue BlogDataNotFound
STDERR.puts "#{file_name}文件沒有找到"
rescue BlogDataFormatError
STDERR.puts "#{file_name}文件數據無效"
rescue Exception => exc
STDERR.puts "讀取#{file_name}文件出錯:#{exc.message}"
end
11.Marshaling Objects
將object 轉換成數據流,方便移動.
12. 互交Ruby
略
13.慣用形式
empty! Bang method( normally do something destructive to the receiver)
empty? 判斷
a || b 如果a為false或nil, 則返回 b, 否則返回a.
a ||= b a = a || b
a += 1 a = a +1
a *= 5 a = a * 5
* 對於大部分操作:a op= b a = a op b
轉載請註明: 轉自船長日誌, 本文鏈接地址: http://www.cslog.cn/Content/ruby_basic_note/zh-hant/