转自http://www.cslog.cn/Content/ruby_basic_note.html
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