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方法



