Каковы различные возможности передачи параметров в методы ruby?пары / hashlist / массив / Aproc? - PullRequest
5 голосов
/ 27 января 2012

Я пытаюсь понять Ruby более глубоко и читал:

http://www.zenspider.com/Languages/Ruby/QuickRef.html#25

Однако я не понимаю, что в этом определении означает следующее:

parameters := ( [param]* [, hashlist] [*array] [&aProc] )

Я знаю, что "param" - это любое количество указанных параметров, и затем я теряюсь, что означает остаток?

Например, у меня есть:

def doIt(param1, param2, param3)
end

и в этом случае[param] * равно param1, param2, param3 ... так, откуда берется хэш-лист?и * array and & aProc?

Может кто-нибудь объяснить мне это

1 Ответ

2 голосов
/ 27 января 2012

Если последний аргумент метода является непустым хеш-литералом, вы можете передать его следующим образом

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...