-
方法调用
方法的调用方式如下:
obj.method
obj::method
上面两种方式都可,但一般主要采取第一种方式。
同时在不产生歧义的条件下可以省略括号 -
可变的参数列
def methodname(a, b, *c)
p [a, b, c]
end
methodname(1, 2, 3, 4, 5) #=>[1, 2, [3, 4, 5]]
多出的实际参数会保存在数组中,然后赋给带有*的参数
注:Ruby1.8中,可变参数必须是形参的最后一个,而Ruby1.9中则无位置及次数的限制
-
带有代码块的方法
调用带有代码块的方法主要作用有以下几点:
1) 循环的抽象化
2) 增加代码块的功能。典型的例子是资源管理
3)回调函数与事件处理器(event handler) -
代码块参数与代码块局部变量
代码块参数与代码块局部变量相互独立,互不影响。eg:
x = 10
(1..5).each{|i| x +=i}
p x #=>25
x=10
(1..5).each{|x| p x += 1 }
p x #=>10
注: 已经传给代码块外部出现过的局部变量,在代码块内部也可以同样使用(闭包)。
- yield
def test
yield "hello"
yield "world"
yield "xautjzd"
end
test do |item|
puts item
end
\#=>hello
\# world
\# xautjzd
- Proc
其实代码块也可以作为一个变量来处理。有时候可能会需要将得到的代码块带入变量或作为其他方法的参数进行传递。这种情况下,则必须在形式参数列的最后加上一个用&修饰的参数(比可变参数还靠后的最后位置),这样调用者所传递的Proc对象(即代码块)便被保存在这个参数中。 eg:
class PlayGames
def register_handler(&handler)
@event_handler = handler
end
def play
@event_handler.call Time.now, "playing"
end
end
xautjzd = PlayGames.new
xautjzd.register_handler {|time, message| p message, " at ", time}
xautjzd.play
Proc对象是将代码块看做对象时的名字。在实际调用带有代码块的方法过程中,可以将传递的代码块替换成Proc对象,当然需要用&进行修饰,将其放在参数列的最后。eg:
proc = Proc.new {puts "proc is called"}
3.times(&proc)
\#=> proc is called
\# proc is called
\# proc is called
- 类方法
类方法的三种定义方式:
1)类名.方法名
class HelloWorld
def HelloWorld.hello(name)
print name, " said Hello."
end
end
HelloWorld.hello("xautjzd") #=>xautjzd said hello.
2)class<<类名
class HelloWorld
.
.
end
class << HelloWorld
def hello(name)
print name, " said hello."
end
end
HelloWorld.hello("xautjzd") #=>xautjzd said hello.
3)self.methodname
class HelloWorld
def self.hello(name)
print name, " said hello"
end
end
HelloWorld.hello("xautjzd") #=>xaujtzd said hello.
- attr_accessor定义类变量
其实attr_accessor也可以用于定义类变量的getter和setter方法,eg:
class Test
class << self
attr_accessor :count
end
end
Test.count =5
puts Test.count
网友评论