Как правильно писать замыкания? - PullRequest
2 голосов
/ 28 декабря 2010

У меня есть значение X. Я буду использовать это значение через некоторое время. На самом деле мне все равно, что это за значение, но через некоторое время я получу другое значение Y, и я хочу знать, если X == Y.

Один из способов хранения данных такого типа - создать замыкание, подобное этому:

def createExactMatchClosure(str)
    return lambda { |t|
        return str == t
    }
end

Теперь я могу использовать этот код, чтобы проверить, равна ли другая переменная моей исходной:

myOriginalValue = "hello"
testerFunction = createExactMatchClosure(myOriginalValue)
puts testerFunction.call("hello").to_s # prints true

Мой вопрос такой: лучше / хуже / по-другому? Я видел оба подхода, используемые в уроках.

def createExactMatchClosure(str)
    string_to_test = str
    return lambda { |t|
        return string_to_test == t
    }
end

Ответы [ 2 ]

3 голосов
/ 28 декабря 2010

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

Единственная разница между первой и второй версией заключается в том, что во второй версии закрываются две переменные вместо одной (str и string_to_test).

Однако вы можете увидеть это только при проверке привязки лямбды с использованием binding и eval, поэтому на практике разница не имеет значения.

1 голос
/ 28 декабря 2010

Это не должно быть другим.Я не уверен в деталях того, как Ruby выполняет замыкания, но интуитивно вам не нужно этого делать.

Способ, которым обычно работает замыкание, состоит в том, что создается объект, который будет содержать ссылку на константы и переменные, объявленные внесвоей области.В одном случае это локальная переменная, в другом случае это параметр.Я думаю, что это не должно иметь значения в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...