kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  207 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

运算符优先度

高 
      ::
       []
       +(单项)   !     ~
       **
       -  (单项)
       *   /    %
       +   -
       <<   >>
       &
       |  ^
       > >=  < <=
       <=> ==  === !=  =~  !~
       &&
       ||
       ..  ...
       ?:(条件操作符)
       =(+=, -= ... )
       not
低   and or

赋值:语法

表达式1 op= 表达式2
op可以是下列中某一个。
   +, -, *, /, %, **, &, |, ^, <<, >>, &&, ||

等同于                                                    表达式1 = 表达式1 op 表达式2
但,当op是“&&”或“||”时则:  表达式1 op (表达式1 = 表达式2)
这个样子。如在属性调用时
obj.foo ||= true     应是    obj.foo || (obj.foo = true)

多重赋值:

foo, bar, baz = 1, 2, 3
foo, = list()
foo, *rest = list2()

语法:
   表达式 [`,' [表达式 `,' ... ] [`*' [表达式]]] = 表达式 [, 表达式 ... ][`*' 表达式]
`*' [表达式] = 表达式 [, 表达式 ... ][`*' 表达式]

     多重赋值是指,在多个表达式以及数组中同时进行的赋值。左边的各个表达式必须是可以被赋值的。若右边只有一个表达式时,则将该表达式的计算值转为数组后,再把数组中的各个元素依次赋值给左边。若右边数组元素的数量超过左边的话,将忽略多余的数组元素。若右边数组元素个数不足的话,将向左边多余的元素中代入nil。
     若左边最后一个表达式前带*的话,则将右边多余的元素以数组的形式代入这个带*的表达式中。若右边没有多余元素的话,就把空数组代入其中。

例:

foo, bar = [1, 2]       # foo = 1; bar = 2
foo, bar = 1, 2         # foo = 1; bar = 2
foo, bar = 1            # foo = 1; bar = nil

foo, bar, baz = 1, 2    # foo = 1; bar = 2; baz = nil
foo, bar = 1, 2, 3      # foo = 1; bar = 2
foo      = 1, 2, 3      # foo = [1, 2, 3]
*foo     = 1, 2, 3      # foo = [1, 2, 3]
foo,*bar = 1, 2, 3      # foo = 1; bar = [2, 3]

在多重赋值过程中,若使用括号的话,就可以把数组内含的元素取出来进行赋值。

(foo, bar), baz = [1, 2], 3       # foo = 1; bar = 2; baz = 3

还可以把特殊形式的赋值表达式转化为多重代入。

class C
  def foo=( v )
    @foo = v
  end
  def []=(i,v)
    @bar = ["a", "b", "c"]
    @bar[i] = v
  end
end

obj = C.new
obj.foo, obj[2] = 1, 2     # @foo = 1; @bar = ["a", "b", 2]

若左边以","结尾或"*"后面没有表达式时,将忽略右边多余的元素。

foo,*    = 1, 2, 3      # foo = 1
foo,     = 1, 2, 3      # foo = 1
*        = 1, 2, 3

当您想忽略方法调用中的所有参数时,就可以使用这个"*"
def foo(*)
end
foo(1,2,3)
多重赋值的值变换为右边的数组。

范围表达式     如:    1 .. 20       
语法为:
表达式1 .. 表达式2
表达式1 ... 表达式2      不包含终点,就像a<= x < b一样。
如果不是出现在条件表达式中的话,它将返回从表达式1到表达式2的范围对象。
范围对象是Range类的实例。

若它出现在条件表达式中时,在表达式1变成真之前,它将一直返回伪。接下来,在表达式2返回真之前,它将一直返回真。一旦表达式2变为真,它将重新返回伪。
  使用".."时,一旦表达式1返回真,马上就会对表达式2进行计算(就象awk)。
  而使用"..."时,在进行下个计算之前,一直都不会对表达式2进行计算(就象sed)。

就这样理解就行,细节等用时再看。

and
表达式 `&&' 表达式
表达式 `and' 表达式

or
表达式 `||' 表达式
表达式 or 表达式

not
`!' 表达式
not 表达式

表达式 `!=' 表达式    <====>!(表达式 == 表达式)

表达式 `!~' 表达式 <====>!(表达式 =~ 表达式)

将包含not的表达式传递给某方法的参数时,必须使用双层括号。
p(! false)      #=> true
p((not false))  #=> true

条件操作符

obj == 1 ? foo : bar

语法:
表达式1 ? 表达式2 : 表达式3
和C是一致的。

 

posted on 2006-12-29 09:33 kenlistian 阅读(116) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。