где определение макроса может иметь несколько значений
blockquote>Макрос не имеет значений. Макрос - это конструкция манипуляции токеном. Когда препроцессор расширяет его, он превращает (ноль или более) входных токенов в выходные токены. Выходные токены просто должны быть действительными токенами, они даже не должны быть действительным кодом Си. Например:
#define foo(t) 1 > 0 t 0 : 1
Это совершенно правильное функциональное определение макроса. Когда мы пишем
foo(;)
илиfoo(3)
, препроцессор подставляет аргумент в последовательность токенов, которую он выплевывает. Конечно, для аргументов, которые мы предоставили, результат синтаксически неверен C. Ноfoo(?)
приведет к действительному C.Смысл этой преамбулы состоял в том, чтобы объяснить, что эти точки с запятой не делают ничего особенного. Они являются лишь частью последовательности токенов, которую выкладывает макрос. Этот макрос предназначен для замены себя последовательностью объявлений и определений функций, которые реализуют системный вызов. Объявления и операторы в органах функций должны заканчиваться символом
;
. Ничего больше.
Блок имеет особое значение в Ruby. Согласно Matz, создателю Ruby, можно посмотреть на блок как на неназванную функцию - обычно что-то, что может быть yield
редактор в, и который может также взять параметры.
Можно видеть следующий вид disamiguation при описании синтаксиса Ruby:
begin
...end
(что называют, блок на других языках) может иногда упоминаться просто как, что это, т.е. выражение (который может в свою очередь содержать другие выражения - выражение - просто что-то, что имеет возвращаемое значение) в Ruby. Некоторые ссылки все еще назовут это a begin/end block
, или a code block
, добавление несколько к беспорядкуdo
...end
или {...}
будет всегда упоминаться как блок в RubyДля примеров просмотрите страницу справочника синтаксиса Ruby, например.
begin
expression
end
expression
while
expression
loop
block
Для дополнительных материалов для чтения см.:
begin/end
строго поток управления, не блоки.
begin
puts "hi"
end
# => "hi"
Код сразу работает. Если бы это был блок, то это имело бы к названный так или иначе для кода в нем для выполнения, как в этом примере:
def a_method; end
a_method { puts "hi" }
# nothing..
def a_method
yield
end
a_method { puts "Hi!" }
# => "Hi!"