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/

此条目发表在 Ruby on Rails 分类目录。将固定链接加入收藏夹。

发表评论