Если последний аргумент метода является непустым хеш-литералом, вы можете передать его следующим образом
def foo(x, y, the_hash)
p the_hash['key2']
end
foo(0, 0, :key1 => 'val1', 'key2' => 42) # 42
вместо обычного пути:
foo(0, 0, { :key1 => 'val1', 'key2' => 42 }) # 42
Обычно,хэш по умолчанию равен {}
(def foo(x, y, the_hash = {})
), поэтому передача пустого хеша соответствует этой схеме.
Кроме того, вы можете указать один аргумент "catch-all" (splat), который станет массивомвсе аргументы, которые еще не назначены обычным аргументам:
def foo(p1, *rest)
p rest
end
foo(0) # "[]"
foo(0, 23, 42) # "[23, 42]"
Или, например,
def foo(p1, *rest, p2)
p rest
end
foo(0, 100) # "[]"
foo(0, 100, 23, 42) # "[100, 23]"
У аргументов с аргументом splat нельзя указывать аргументы со значением по умолчанию.Поэтому синтаксис хеш-аргумента и аргумент splat редко используются в комбинации.
Наконец, в определении вашего метода в качестве последнего аргумента вы можете использовать идентификатор с префиксом &
, который будет указывать на блок в методе.вызов (его Proc
объект) или nil
, если его нет.Обычно это не требуется, если вы просто хотите вызвать блок - для этого вы можете использовать yield
.
def foo(&p)
p.call
end
foo { puts "hello" } # hello
против
def foo
yield
end
foo { puts "hello" } # hello