实例:
foo.bar() foo.bar bar() print "hello world\n" print
语法:
[表达式 '.'] 标识符 ['(' 表达式 ... ['*' [表达式]] ')']
方法调用表示调用目标(点「.」左边的表达式之值)的方法。若是没有指定目标,则表示调用自身的方法。
方法的名称可以为一般的标识符,也可以以「?」或「!」结尾。依照惯例,「?」用在谓词型的方法名称,也就是返回 true 或 false 值的方法。而「!」是用在比同名(无「!」)方法更具破坏性的方法名称上(例如:tr 与 tr!)。
若是最后的参数以 * 开头,则先展开该参数的值,然后再传递:
foo(*[1,2,3]) # 相当于 foo(1,2,3)
实例:
super super(1,2,3)
语法:
super super(表达式 , ... )
super
呼叫超类中正由当前方法所覆盖的函数。若是省略了括号和参数,当前方法的参数则原封不动的传递给超类中的同名方法。若是调用超类方法而不想使用当前参数时,用空的括号如:
super()。
class Foo def foo(arg=nil) p arg end end class Bar < Foo def foo(arg) super(5) # 以 5 作为参数进行调用 super(arg) # 以 5 作为参数进行调用 super # 以 5 作为参数进行调用;super(arg)的简写 arg = 1 super # 以 1 作为参数进行调用;super(arg)的简写 super( ) # 无参数调用 end end Bar.new.foo 5
实例:
[1,2,3].each do |i| print i*2, "\n" end [1,2,3].each {|i| print i*2, "\n" }
语法:
方法(参数1, 参数2, ...) do ['|' 表达式 ... '|'] 表达式 ... end 方法(参数1, 参数2, ...) '{' ['|' 表达式 ... '|'] 表达式 ... '}'
迭代器是用来精简控制结构(尤其是循环)。若是调用了接着 do ... end 或 { ... } (称为区块)的方法,则该方法就是在该区块中所计算。迭代器所调用的区块就是使用 yield 表达式,传递给 yield 值会被两条杠「||」之间的变量赋值。
{ ... }区块的约束力比 do ... end 区块强。
foobar a, b do .. end #foobar 为迭代器方法
foobar a, b { .. } # b 为迭代器方法
在区块当中第一次赋值(声明)的区域变量仅在该区块中有效。
foobar { i = 20 # 声明区域变量 「i」 ... } # 「i」在此没有被定义 foobar a, b do i = 11 # 声明一个完全不同的「i」 ... end
与大多数的方法相同,若是迭代器在区块中由 break 所中断则返回 nil 。当 break 带参数时则迭代器返回该参数之值。
实例:
yield data
语法:
yield '(' [ 表达式 [',' 表达式 ... ]] ')' yield [ 表达式 [',' 表达式 ... ]]
将参数传递给区块作为参数,然后对区块进行计算。yield 是在 方法定义 定义 迭代器 时使用的语句。
def foo yield(1,2) end foo {|a,b| p [a,b]}
区块参数的赋值操作遵从 并行赋值 的规律,若是没有提供区块给执行 yield 的方法(也就是说该方法非迭代器)则会抛出 LocalJumpError 异常。
yield 返回该区块最后计算的表达式结果。若是区块的执行由
next 中断则返回 nil 。当 next 包含参数时,则返回该参数之值。