2013-11-23 2 views
0

Я люблю чувствовать блок Ruby do ... end, и мне бы хотелось использовать его для инициализации хэша. Я знаю о фигурной фигурной скобке, например.Возможно ли инициализировать хэш-код Ruby блоком do?

h = { 
    :a => 10, 
    :b => 20 
} 

Но мне было интересно, есть ли способ сделать то же самое с блоком do, например.

h_keys = keys do 
    :a => 10, 
    :b => 20 
end 

Редактировать

Позвольте мне быть ясным: я понимаю, что хэш-литерал не блок, и у меня есть довольно хорошее представление о внутренностях блока. Что мне интересно, так это следующее:

Возможно ли, возможно, с помощью (но не ограничено) каким-то умным методом метапрограммирования написать такую ​​функцию, чтобы переданный в нее блок интерпретировался как хэш ?

+0

если вы google 'ruby hash', вы найдете документацию для него в лучших результатах и ​​все вам нужно знать о них (включая его конструктор, который действительно позволяет использовать блок) –

+0

Мне непонятно ... можете ли вы немного конкретнее? Вы видели http://www.ruby-doc.org/core-2.0.0/Hash.html#method-c-new? –

+0

sawa правильно, что ответ «нет», но я хотел добавить, что, вероятно, это будет очень полезно, если вы лучше поймете, что происходит внутри блоков. Есть несколько замечательных сообщений в блоге (также некоторые объясняют разницу между блоками, procs и lambdas). Когда вы поймете блоки, вы поймете, что они могут и чего не могут сделать, и эффективное использование их в вашем коде может быть действительно полезным. – farski

ответ

1

Это немного похоже на нужный образец кода, хотя do ... end ушел:

def keys(x); x; end 
h = keys a: 1, b: 2 

К сожалению keys do a: 1, b: 2 end не соответствует грамматике Руби. Естественно, вы могли все еще писать препроцессор, который будет работать над исходным файлом, переписать добавленный синтаксис на стандартный синтаксис Ruby, а затем передать его интерпретатору. Это было бы более чем сумасшедшим, но если вы захотите это сделать, вам будет больше силы ...

+0

Достаточно честный. Спасибо за попытку –

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