方法调用

实例:

foo.bar()
foo.bar
bar()
print "hello world\n"
print

语法:

[表达式 '.'] 标识符 ['(' 表达式 ... ['*' [表达式]] ')']

方法调用表示调用目标(点「.」左边的表达式之值)的方法。若是没有指定目标,则表示调用自身的方法。

方法的名称可以为一般的标识符,也可以以「?」或「!」结尾。依照惯例,「?」用在谓词型的方法名称,也就是返回 true 或 false 值的方法。而「!」是用在比同名(无「!」)方法更具破坏性的方法名称上(例如:tr 与 tr!)。

若是最后的参数以 * 开头,则先展开该参数的值,然后再传递:

foo(*[1,2,3])   # 相当于 foo(1,2,3)

super

实例:

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

实例:

yield data

语法:

yield '(' [ 表达式 [',' 表达式 ... ]] ')'
yield [ 表达式 [',' 表达式 ... ]]

将参数传递给区块作为参数,然后对区块进行计算。yield 是在 方法定义 定义 迭代器 时使用的语句。

def foo
  yield(1,2)
end

foo {|a,b| p [a,b]}

区块参数的赋值操作遵从 并行赋值 的规律,若是没有提供区块给执行 yield 的方法(也就是说该方法非迭代器)则会抛出 LocalJumpError 异常。

yield 返回该区块最后计算的表达式结果。若是区块的执行由 next 中断则返回 nil 。当 next 包含参数时,则返回该参数之值。