2015-05-11 5 views
2

Почему рубин иногда интерпретирует хэш как блок кода?Раздражающая проблема о рубиновых хешах

Например, у меня есть функция под названием «требуется», которая принимает хеш, так что я делаю:

required { base_uri: String, endpoints: String, destination: String, credentials: Hash} 

и думаю, это это блок кода и ошибок с unexpected tSYMBEG.

Единственный способ исправить это поставить скобки вокруг него так гласит:

required({ base_uri: String, endpoints: String, destination: String, credentials: Hash}) 

Затем он начинает читать его как хэш (как я хочу его).

Я не беспокоюсь о том, чтобы положить скобки вокруг хеша, что раздражает то, что это непоследовательно, иногда это срабатывает, а иногда и нет.

Что происходит?

+3

Как может быть отдельный хеш Ruby из блока, если вы не используете круглые скобки в этом случае? –

+2

Просто опустите скобки для параметров хэша – max

+0

@papirtiger абсолютно прав .. –

ответ

5

Если вы опустили круглые скобки вызова метода, вы также должны опустить фигурные скобки вокруг хешей.

1

Нет несоответствия. Ruby просто используют те же символы {} для разграничения блока кода и как оператор-конструктор Hash.

Если в качестве аргумента proc/method указано значение всегда рассматривается как блок. По этой причине вам нужно поставить хэш-аргумент в parens, чтобы отличить от блока или передать непосредственно хэш-элементы, как уже упоминалось в @Aetherus.

Довольно последовательный, если вы спросите меня.

2

Вы выбрали тот способ, который наименее используется. Наиболее часто в этом случае было бы опустить оба вида пунктуации:

required base_uri: String, endpoints: String, destination: String, credentials: Hash 

После этого, на следующий общий путь будет только с Паренс:

required(base_uri: String, endpoints: String, destination: String, credentials: Hash) 

После этого с обоими: (также были бы необходимы, если бы у вас были параметры после хэша)

required({ base_uri: String, endpoints: String, destination: String, credentials: Hash})