Это правда, вам не нужны анонимные функции (или лямбды, или как вы хотите их вызывать).Но есть много вещей, которые вам не нужны .Вам не нужны классы - просто передайте все переменные экземпляра обычным функциям.Тогда
class Foo
attr_accessor :bar, :baz
def frob(x)
bar = baz*x
end
end
станет
def new_Foo(bar,baz)
[bar,baz]
end
def bar(foo)
foo[0]
end
# Other attribute accessors stripped for brevity's sake
def frob(foo,x)
foo[0] = foo[1]*x
end
Аналогично, вам не нужно никаких циклов, кроме loop...end
с if
и break
.Я мог бы продолжать и продолжать. 1 Но вы хотите, чтобы программировал с классами на Ruby.Вы хотите, чтобы могли использовать while
петли или, может быть, даже array.each { |x| ... }
, и вы хотите иметь возможность использовать unless
вместо if not
.
Так же, какЭти функции, анонимные функции помогут вам выразить вещи элегантно, лаконично и осмысленно.Возможность писать some_function(lambda { |x,y| x + f(y) })
гораздо приятнее, чем писать
def temp(x,y)
x + f(y)
end
some_function temp
Гораздо громче приходится прерывать поток кода, чтобы написать функцию с подпиткой def
, которая затем должна бытьдано бесполезное имя, когда так же ясно написать операцию в строке.Это правда, что нигде вы не должны использовать лямбду, но есть много мест, в которых я бы предпочел использовал бы лямбду.
Ruby решает большую частьЛямбда-случаи с блоками: все функции, такие как each
, map
и open
, которые могут принимать блок в качестве аргумента, в основном принимают анонимную функцию в специальном корпусе.array.map { |x| f(x) + g(x) }
- это то же самое, что и array.map(&lambda { |x| f(x) + g(x) })
(где &
делает лямбду «особенной» точно так же, как голый блок).Опять же, вы могли бы каждый раз записывать отдельную функцию def
feed - но зачем вам хотеть to?
Языки, отличные от Ruby, которые поддерживают этот стильпрограммирование не имеет блоков, но часто поддерживает более легкий лямбда-синтаксис, такой как \x -> f x + g x
на Haskell или x => f(x) + g(x);
2 на C #.Каждый раз, когда у меня есть функция, которая должна принимать абстрактное поведение, например, map
, или each
, или on_clicked
, я буду благодарен за возможность передавать лямбду вместо именованной функциипотому что это намного проще .В конце концов, вы перестаете думать о них как о чем-то особенном - они так же интересны, как буквальный синтаксис для массивов вместо empty().append(1).append(2).append(3)
.Просто еще одна полезная часть языка.
1: В вырожденном случае вам действительно нужно только восемь инструкций : +-<>[].,
.<>
переместить воображаемый «указатель» вдоль массива;+-
увеличить и уменьшить число в текущей ячейке;[]
выполнить цикл пока ненулевой;и .,
делать ввод и вывод.На самом деле вам нужна всего лишь одна инструкция , например subleq a b c
(вычтите a
из b
и перейдите к c
, если результат меньше или равен нулю).
2: На самом деле я никогда не использовал C #, поэтому, если этот синтаксис неправильный, не стесняйтесь его исправлять.