Метод bind
создает новую функцию из другой функции с одним или несколькими аргументами, привязанными к конкретным значениям, включая неявный аргумент this
.
Это пример частичного применения . Обычно мы предоставляем функцию со всеми ее аргументами, которая дает значение. Это известно как функция приложения. Мы применяем функцию к ее аргументам.
Частичное применение является примером функции высшего порядка (HOF), поскольку она дает новую функцию с меньшим количеством аргументов ,
Вы можете использовать bind
для преобразования функций с несколькими аргументами в новые функции.
function multiply(x, y) {
return x * y;
}
let multiplyBy10 = multiply.bind(null, 10);
console.log(multiplyBy10(5));
В наиболее распространенном случае использования при вызове с В одном аргументе метод bind
создаст новую функцию, у которой значение this
привязано к определенному значению. По сути это превращает метод экземпляра в статический метод.
function Multiplier(factor) {
this.factor = factor;
}
Multiplier.prototype.multiply = function(x) {
return this.factor * x;
}
function ApplyFunction(func, value) {
return func(value);
}
var mul = new Multiplier(5);
// Produces garbage (NaN) because multiplying "undefined" by 10
console.log(ApplyFunction(mul.multiply, 10));
// Produces expected result: 50
console.log(ApplyFunction(mul.multiply.bind(mul), 10));
В следующем примере показано, как можно использовать привязку this
объектный метод, действующий как обратный вызов, который может легко обновлять состояние объекта.
function ButtonPressedLogger()
{
this.count = 0;
this.onPressed = function() {
this.count++;
console.log("pressed a button " + this.count + " times");
}
for (let d of document.getElementsByTagName("button"))
d.onclick = this.onPressed.bind(this);
}
new ButtonPressedLogger();
Есть два способа загрузки файлов в Rails:
app / controllers / pages_controller.rb
и ссылка на PagesController, автоматически загрузится app / controllers / pages_controller.rb
. Это происходит для предустановленного списка каталогов в пути загрузки. Это особенность Rails, которая не является частью обычного процесса загрузки Ruby. требуют
d. Если файл требует
d, Ruby просматривает весь список путей в ваших путях загрузки и находит первый случай, когда файл, который вам требуется
d, находится в пути загрузки. Вы можете увидеть весь путь загрузки, проверив $ LOAD_PATH (псевдоним для $ :). Поскольку lib
находится в вашем пути загрузки, у вас есть два варианта: либо присваивать файлам имена, совпадающие с именами констант, чтобы Rails автоматически выбирал их, когда вы ссылаетесь на рассматриваемую константу, либо явно требовать модуль.
Я также заметил, что вы можете запутаться в другом. ApplicationController - это , а не корневой объект в системе. Обратите внимание:
module MyModule
def im_awesome
puts "#{self} is so awesome"
end
end
class ApplicationController < ActionController::Base
include MyModule
end
class AnotherClass
end
AnotherClass.new.im_awesome
# NoMethodError: undefined method `im_awesome' for #<AnotherClass:0x101208ad0>
Вам нужно будет включить модуль в любой класс, в котором вы хотите его использовать.
class AnotherClass
include MyModule
end
AnotherClass.new.im_awesome
# AnotherClass is so awesome
Конечно, чтобы иметь возможность включить модуль в первую очередь, вам нужно, чтобы он был доступен (используя любой из описанных выше методов).
поэтому Rails автоматически подберет их, когда вы ссылаетесь на рассматриваемую константу или явно запрашиваете модуль.Я также заметил, что вас может смутить еще одна вещь. ApplicationController - это , а не корневой объект в системе. Обратите внимание:
module MyModule
def im_awesome
puts "#{self} is so awesome"
end
end
class ApplicationController < ActionController::Base
include MyModule
end
class AnotherClass
end
AnotherClass.new.im_awesome
# NoMethodError: undefined method `im_awesome' for #<AnotherClass:0x101208ad0>
Вам нужно будет включить модуль в любой класс, в котором вы хотите его использовать.
class AnotherClass
include MyModule
end
AnotherClass.new.im_awesome
# AnotherClass is so awesome
Конечно, чтобы иметь возможность включить модуль в первую очередь, вам нужно, чтобы он был доступен (используя любой из описанных выше методов).
поэтому Rails автоматически подберет их, когда вы ссылаетесь на рассматриваемую константу или явно запрашиваете модуль.Я также заметил, что вас может смутить еще одна вещь. ApplicationController - это , а не корневой объект в системе. Обратите внимание:
module MyModule
def im_awesome
puts "#{self} is so awesome"
end
end
class ApplicationController < ActionController::Base
include MyModule
end
class AnotherClass
end
AnotherClass.new.im_awesome
# NoMethodError: undefined method `im_awesome' for #<AnotherClass:0x101208ad0>
Вам нужно будет включить модуль в любой класс, в котором вы хотите его использовать.
class AnotherClass
include MyModule
end
AnotherClass.new.im_awesome
# AnotherClass is so awesome
Конечно, чтобы иметь возможность включить модуль в первую очередь, вам нужно, чтобы он был доступен (используя любой из описанных выше методов).