Monday, 7 November 2011

Note FOR Ruby 1.9 之写在最后

  在Ruby中,由于函数调用时可以省略参数列表两边的括号,使一些看起来像关键字的其实却为一个Method。例如:
class X
    def my_attribute= (aValue)
        @attr = aValue
    end
end

ob.my_attribute = 1
ob.my_attribute=(1)
  类似这样把一个函数调用伪装成另一种形式称为“Mimic Method”。类似的还有private,protected,attr_reader等等。
1 class MyClass
2      attr_accessor :my_attr
3
4      def initialize_attributes
5          my_attr = 10
6      end
7 end
8
9 obj = MyClass.new
10 obj.initialize_attributes
11 puts obj.my_attr
  这里结果输出nil,因为在initialize_attributes中的my_attr = 10,这个有歧义,一个是赋值给一个变量,或者是在调用一个Mimic Method,这里Ruby默认解释为赋值,为了消除歧义则改成self.my_attr = 10即可

  Ruby中只有nil和false为布尔值FALSE,所以表达式 a ||= []的作用为: if a != nil
    a = a
else
    a = []
  利用这些特性可以减少很多为避免变量为nil的初始化操作。
  Ruby没有命名参数,但是可以将多个参数当作一个hash传入,例如:
def my_method(args)
end

my_method(:a => 'X', :b => 3, :c => 'Y')
  类似的,如果要传入一个参数数组,则:
def my_method(*args)
end

my_method('X', 3, 'Y')
  并且Ruby中Method也支持参数默认值。
Self yield用法:将对象自己传到block中使用,例如用作类的初始化:
class MyClass
    def initialize
        yield self if block_given?
......
ob = MyClass.new { |o|
    o.var = "aVar"
}
  Ruby1.9中增加了tap方法,其yields x到block中,然后返回x,可用于一个method chain中检查调用链中某方法是否正确。

  Symbol#to_proc:
names = ['a', 'b', 'c']
names.map { |name| name.capitalize }
  类似这样一个参数,并且这个参数调用一个方法称为‘one-call block’,这个在Ruby中很常见,所以有办法将其简化:
class Symbol
    def to_proc
        Proc.new { |x| x.send(self) }
    end
end
  为Symbol添加了一个to_proc方法,由此可以简化为:
names.map(&:capitalize.to_proc)
  或者names.map(&:capitalize),因为&会自动调用to_proc方法将object转化为Proc.在Ruby1.9中Symbol已经定义了to_proc方法,并且支持block带多个参数,例如inject方法

No comments :

Post a Comment