Ruby語言入門

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/

此條目發表在 Ruby on Rails 分類目錄。將固定鏈接加入收藏夾。

發表評論