2009-01-23 1 views
2

я встретил это, когда я прочитал ZenTest исходный код:«_» параметр рубина блок

Вот определение add_mapping метода:

def add_mapping(regexp, &proc) 
    @test_mappings << [regexp, proc] 
end 

В Autottest.initailize(), add_method дозвонились добавить отображение для реализации.

self.add_mapping(/^lib\/.*\.rb$/) do |filename, _| 
    possible = File.basename(filename).gsub '_', '_?' 
    files_matching %r%^test/.*#{possible}$% 
end 

Вопрос в том, что означает «_», второй параметр блока, означает? Кажется, он не используется в блоке.

Благодаря

ответ

7

Это идиома, используемая для указания параметра, связанного с '_', не используется, хотя требуется передать его блоку/методу.

пример:

def blah 
    yield 1,2 
end 

blah {|a,b| 
    puts a 
    # b is never used 
} 

по сравнению с идентичным:

blah {|a,_| 
    puts a 
} 

Обратите внимание, что «_» является вполне законным имя переменной в рубин, так что обе версии идентичны, следующие работы как хорошо:

blah {|a,_| 
    puts _ 
} 

Использование «_» не более чем конвенции, как с помощью i для счетчиков, «x» и «y» или «foo» и «bar».

Это означает, что вы здорово, потому что вы были баловаться с функциональным программированием, которое, я считаю, где эта идиома orignates ...

+0

@ a2800276, не могли бы вы показать мне несколько уроков или ресурсов об этой «_» идиоме? – eric2323223

+0

Нет учебников, это просто идиома, обычное использование. Это просто переменное имя, как и любое другое (я отредактировал ost, чтобы сделать это более ясным). «Функциональный шаблон программирования Google, соответствующий шаблону», если вы хотите проверить происхождение. – a2800276

2

Может быть, автор использует его в качестве короткого имени переменной, так что второй параметр может быть проигнорирован.

+0

Вы имеете в виду символ «_» здесь может быть заменена любой переменной имя? – eric2323223

+0

Правильно, я думаю. Поскольку он не используется, это не имеет значения. –

+0

Это правильно. _ является распространенным во многих языках для имени переменной, которое не видит явного использования. Это означает «игнорировать меня» –

4
def animals 
    yield "Tiger" 
    yield "Giraffe" 
end 
animals { |_| puts "Hello, #{_}" } 

Пример украдена из http://en.wikibooks.org/wiki/Ruby_Programming/Ruby_Basics

Насколько я могу видеть, это определение _ в качестве переменной, которая может ссылаться в дальнейшем. Это просто заставляет рубиновую руку и определяет _ в отношении ценности того, что дается.

+0

@ Radar, я мог бы понять ваш пример. Но почему «_» в моем вопросе ссылается на результат блока? Как именно последовательность вызова add_method? Насколько я понимаю, «_» следует ссылаться на переменную «filename». – eric2323223

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

  • Нет связанных вопросов^_^