2013-11-12 2 views
4

Я знаю, что в Рубине 2.0, а затем вы можете иметь аргументы ключевых слов, так что вы можете определить метод, как это:В Ruby есть встроенный метод, который требует ключевых слов?

def foo(inline_argument, *args, **kwargs, &block) 
    puts 'bar' 
end 

Однако, мне было интересно: есть встроенный метод, который использует аргументы ключевого слова?

+2

Почему это имеет значение? – sawa

+0

Я должен написать 'method_missing' в пользовательском классе, и я не уверен, что мне нужно реализовать его как' def method_missing (meth, * args, ** kwargs, & block) 'или просто' def method_missing (meth, * args , & block) '. Я имею в виду, я не знаю, насколько вероятно получить метод с аргументами ключевого слова. –

+2

Поскольку синтаксис позволяет это, вы должны ожидать, что столкнетесь с таким использованием, независимо от фактического использования на данный момент. – sawa

ответ

3

Я cd редактора в мой Ruby, установить каталог и побежал grep -r ', \*\*' . и обнаружил, что да, есть методы в STDLIB, которые используют **kwargs, но только в open3.rb библиотеки.

./lib/ruby/2.1.0/open3.rb: def popen3(*cmd, **opts, &block) 
./lib/ruby/2.1.0/open3.rb: def popen2(*cmd, **opts, &block) 
./lib/ruby/2.1.0/open3.rb: def popen2e(*cmd, **opts, &block) 
./lib/ruby/2.1.0/open3.rb: def capture3(*cmd, stdin_data: '', binmode: false, **opts) 
./lib/ruby/2.1.0/open3.rb: def capture2(*cmd, stdin_data: '', binmode: false, **opts) 
./lib/ruby/2.1.0/open3.rb: def capture2e(*cmd, stdin_data: '', binmode: false, **opts) 
./lib/ruby/2.1.0/open3.rb: def pipeline_rw(*cmds, **opts, &block) 
./lib/ruby/2.1.0/open3.rb: def pipeline_r(*cmds, **opts, &block) 
./lib/ruby/2.1.0/open3.rb: def pipeline_w(*cmds, **opts, &block) 
./lib/ruby/2.1.0/open3.rb: def pipeline_start(*cmds, **opts, &block) 
./lib/ruby/2.1.0/open3.rb: def pipeline(*cmds, **opts) 

EDIT:

В @mdesantis предложение, я сделал MRI identifier search для rb_get_kwargs; оказалось, что в библиотеке ядра C есть, по крайней мере, несколько методов, которые используют ключевые слова args.

Dir.new(string, encoding: enc) -> aDir 

Array#sample(n, random: rng) -> new_ary 
Array#shuffle!(random: rng) -> ary 

GC.start(full_mark: false) -> nil 
+1

К сожалению, эта проверка не учитывает, что большинство основных методов реализовано в C – mdesantis

+1

Nice; Я бы добавил ['GC.start'] (http://www.ruby-doc.org/core-2.1.0/GC.html#method-c-start) – mdesantis

Смежные вопросы