Направляющие / модули lib и

Создание новой функции путем привязки аргументов к значениям

Метод bind создает новую функцию из другой функции с одним или несколькими аргументами, привязанными к конкретным значениям, включая неявный аргумент this.

Частичное применение

Это пример частичного применения . Обычно мы предоставляем функцию со всеми ее аргументами, которая дает значение. Это известно как функция приложения. Мы применяем функцию к ее аргументам.

Функция высшего порядка (HOF)

Частичное применение является примером функции высшего порядка (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));

Реализация StateBall CallBack

В следующем примере показано, как можно использовать привязку 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();      

81
задан Jonathan Bender 9 July 2015 в 18:12
поделиться

1 ответ

Есть два способа загрузки файлов в 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

Конечно, чтобы иметь возможность включить модуль в первую очередь, вам нужно, чтобы он был доступен (используя любой из описанных выше методов).

146
ответ дан 24 November 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: