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社区使用两个空白表示一个缩进。