We walk and learn
Ruby version: 2.3.0
obj.func(p1, p2, ..., pn)
在面向对象的世界,调用方法可以理解为“向对象发送消息”。上面的代码中接收者为 obj
,消息为 func
,括号中的为消息的参数。在调用方法时 ()
可以省略。
obj.func(p1, p2, ..., pn) do |v1, v2, ... |
block
end
obj.func(p1, p2, ..., pn) { |v1, v2, ... |
block
}
可以使用 do ~ end
或 {}
将块传递给方法。使用 do ~ end
时,可以省略参数列表的 ()
。使用 {}
时,只有参数列表为空才可省略 ()
。
四则运算等二元运算符,负号等一元运算符,指定数组、散列的元素下标的 []
等,实际上都是方法。
Array.new
,Time.now
等。print
,sleep
等。def func_name(p1, p2, ..., pn)
func_content
end
def f(a, b=1, c)
return a + b + c
end
f(10, 100) # => 111
f(10, 2, 100) # => 112
def f(n)
if n < 0 then
return
elsif n == 0 then
return 0
n
end
f(-1) # => nil
f(0) # => 0
f(1) # => 1
return
语句指定方法的返回值。return
时,方法最后一个表达式的结果就会成为方法的返回值。return
的参数,方法将返回 nil
。yield
定义的地方执行。yield
部分有参数,程序就会将其当作块变量传递到块中。yield
的返回值在块的外部继续使用。def f(a, *b)
[a, b]
end
f(1) # => [1, []]
f(1, 2, 3) # => [1, [2, 3]]
*args
形式来定义个数不确定的参数。def f(a, *b, c)
。def f(a: 1, b: 2)
a * b
end
name: value
形式指定默认参数。value
,但调用时此参数不可省略。def f(a: 0, **b)
[a, b]
end
f(a: 1) # => [1, {}]
f(a: 1, x: 10) # => [1, {:x=>10}]
**args
的形式,接收未定义的关键字参数,这些参数将以散列对象的形式保存。def f(a:1, b:2)
a * b
end
f({a: 10})
f(a: 10)
f(x: 10) # => ArgumentError
{}
。def foo(a, b, c)
a * b * c
end
foo(1, *[2, 3])
Ruby社区使用两个空白表示一个缩进。