注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

Ruby基本知识(五)  

2012-01-29 19:50:26|  分类: Ruby |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关于ruby的表达式
Ruby和其他语言的一个不同之处就是任何东西都能返回一个值,几乎所有对象都是表达式
它的好处,就是可以可轻松的实现链式操作
例如if和case语句都返回最后执行的表达式的值
song_type = if song.mp3_type == MP3::Jazz
                if song.written < Date.new(1935,1,1)
                    Song::TradJazz
                else
                    Song::Jazz
                end
            else
                Song::Other
            end
            
rating =     case votes_cast
            when 0...10 then Rating::SkipThisOne            
运算符表达式
重新定义了Fixnum的+方法
class Fixnum
    alias old_plus + #we can reference the original '+' as 'old_plus'
    def +(other)
        old_plus(other).succ #取下一个值类似于next的方法
    end
end

1+2
a = 3
a += 4
表达式之杂项
命令展开
如果你使用反引号(`) 或者以%x为前缀的括起一个字符串,默认情况下,它会被当作一个底层操作系统命令来执行
,表达式的返回值是该命令的标准输出
`pwd`
puts `ls`
%x{HELP}

重定义反引号
alias old_backquote `
def `(cmd)
    result = old_backquote(cmd)
    result += "... ... ..."
end

puts `pwd`

赋值语句有两种基本形式
第一种形式
将一个对象的引用赋值给变量或者常量(这在ruby里是直接执行的)
a = 9
第二种形式
等号的左边是对象的属性或者元素的引用
这种形式是通过调用左边值的方法来实现赋值的,这意味者你可以重载它们
定义一个以等号结尾的方法
class Song
    def duration=(new_value)
        @duration = new_value
    end
end

设置属性的方法不必与实例变量对应
class Song
    def time=(new_value)
        self.duration = new_value
    end
end
并行赋值
例如交换a和b的值
a,b = b,a

使用ruby的并行赋值,你可以叠起和展开数组,如果最后一个左值有一个"*"的前缀,那么多余的右值会被集合在一块,并作为一个数组赋给左值
同样的当最后一个右值是一个数组,并且在它的前面加一个"*",它将被展开成其他元素(如果右面只有一个右值,没有必要加*,因为数组会自动展开)
举例
a = [1,2,3]
b,c = a #=> b = 1 , c = 2
b,c = 11, a #=> b = 11, c = [1,2,3]
b,*c = 11, a #=> b =11, c = [[1,2,3]]
b,c = 11, *a #=> b =11, c = 1
b,*c = 11, *a #=> b =11, c = [1,2,3]

嵌套赋值
ruby会提取对应的右值,并赋值给括起来的变量
b, (c, d), e = 1, 2, 3, 4 #=> b = 1, c = 2, d = nil, e = 3
b, (c, d), e = [1,2,3,4]  #=> 结果同上
b, (c, d), e = 1,[2,3],4 #=>  b = 1, c = 2, d = 3, e = 4


Ruby 不支持Java中的++和--语句要使用的话,可以使用i += 1 或者 i -= 1

布尔表达式
Ruby对真假的定义很简单,任何不是nil或false的值都是真(true)

defined? 用于对表达式的判断
defined? String #=> "constant"
defined? a = 10 #=> "assignment"
defined? true #=> "true"
defined? a #=> "local-variable"

== 比较值相等
eql? 如果接受者和参数有相同的数据类型和相等的值,则返回真
equal? 如果接受者和参数有相同的对象id,则返回真

1 == 1.0 #=> true
1.eql? 1.0 #=> false
1.equal? 1.0 #=> false

逻辑表达式的值
举例说明:
var1 and var2,如果var1为假或nil,那么表达式的值就是var1,如果var1为其他值,那么结果为var2
所以表达式的结果取决于谁决定它的结果

nil and true #=> nil
99 and false #=> false
99 and "ruby" #=> "ruby"
11 or "ruby" #=> 11
nil or "ruby" #=> "ruby"

words[key] ||= [] #=> words[key] = words[key] || []
words[key] << word

上面两句合成一行
(words[key] ||= words[key]) << word


if and unless语句

一般if语句写法
if a == 11
    puts "a == 11"
elsif a == 12
    puts "a == 12"
else
    puts "a is other value"
end

第二种写法
if a == 11 then puts "a == 11"
elsif a == 12 then puts "a == 12"
else puta "a is other value"

第三种写法
把then变成":" 让表达式更简洁

if和unless修饰符
do_something if condition # when condition is true
do_something unless condition # when condition is false

ruby也支持条件表达式(类似于Java或C风格)
b = a? c : d

case语句
两种形式
第一种像if一样
case a
when a == 11 then puts "a == 11"
when a == 12 then puts "a == 12"
else puts "a is other value"

第二种 when后面直接跟条件
case a
when 11, 12 then puts "a == 11 or a == 12" #=>后面可以跟多个条件
when 1..10 then puts "a in 10"
else puts "a is other value"

循环
while
条件为真
i = 200
while i > 100
    puts i
    i = i-1
end

until循环与此相反,它执行循环直到条件变为真,结束
i = 200
until i < 100
    puts i
    i = i-1
end

a = 1
a *= 2 while a < 100
a = 200
a -= 10 until a < 100

迭代器
3.times { puts "Hello"}
3.downto(1) {puts "Hello"}
3.upto(10) {puts "Hello"}

0.step(12, 3) {|x| puts x}
[1,2,3].each {|x| puts x}

for i in [1, 2, 3]
    puts i
end


Break Redo and Next
Break 和Java中一样
Next 和Java中的continue一样
Redo 重新执行此次语句,但不判断条件
1.upto 3 do |i|
    puts i
    redo if i == 2
end


异常处理
begin
    do_something
rescue ArgumentError => error then #then可以省略
    puts error.message
rescue TypeError #异常的补充变量可以省略
    puts "this is TypeError"
rescue => another_error #类也可以省略
    puts another_error.message
else
    puts "no error" #没有异常
ensure
    puts "ensure" #必须执行的地方 相当于Java的finally
end

首先用begin .. end将可能发生异常的部分圈起来。在这个范围内,如果发生了异常,则程序会自动跳到对应的rescue部分
在rescue部分中,可以指定处理异常的种类,如果需要异常信息,则需要补充变量。
当然如果你不指定异常类型的话,默认是StandardError类
ensure下的内容,永远都会执行
当然这几部分,你可以随意组合
begin
    do_something
ensure
    puts "ensure"
end


rescue表达式
do_something rescue error_handling #这种方式,不能指定异常类,也不能捕获异常对象

raise
主动抛出异常
raise ArgumentError "message"


raise ArgumentError #=> 产生无错误信息的ArgumentError异常
raise 'message'     #=> 产生错误信息是message的RuntimeError的异常
raise #=> 产生无错误信息的RuntimeError异常

大范围跳出
catch(:exit){
    loop do
        loop do
            throw :exit
        end
    end
}

Modules
模块式一种将方法,类和常量组织在一起的方法,模块给你提供两个主要好处:
1.模块提供命名空间,来防止命名冲突
2.模块实现了mixin功能

模块定义了一个namespace ,它是一个沙箱(sandbox) 你的方法和变量可以在其中任意发挥,而无需被其他的方法或常量干扰
1.9
module AModule
    def AModule.method_34
        puts self
    end
end

module BModule #B中两个方法的区别?
    def BModule.method_34
        puts self
    end
    
    def method_33
        puts self
    end
end

include BModule

AModule.method_34
BModule.method_34
BModule.method_33



问题include和require的区别,为什么在同一个文件中我调用module的方法还要使用include方法

1、requre,load用于文件,如.rb等等结尾的文件。
2、include则用于包含一个文件(.rb等结尾的文件)中的模块。
3、requre一般情况下用于加载库文件,而load则用于加载配置文件。
4、requre加载一次,load可加载多次。

Mixin(混入)
利用Mixin可以实现多继承


module Debug
    def whoAmI?
        "#{self.class.name}"
    end
end

class ClassA
    include Debug #实例化module Debug
    def methodA
        puts whoAmI?
    end
end

class ClassB
    include Debug
    def methodB
    end
end

a = ClassA.new
b = ClassB.new
a.methodA
puts b.whoAmI?
  评论这张
 
阅读(330)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017