В вашем фрагменте кода p более или менее является функцией обратного вызова. Обратный вызов - это функция, которая должна выполняться после завершения выполнения другой функции.
В вашем случае вы создаете другую функцию, в которой используется ваш p.
Вы можете увидеть это, просто войдя в свой p var. p - это функция (обратный вызов) в вашем коде, поэтому вы должны увидеть, что функция выводится.
repeat = (n, action) => {
console.log("Action: ", action);
for(i=1; i<=n; ++i) {
action(i);
}
}
let test_array = [];
repeat(5, p => {
test_array.push(p);
})
Ваш код такой же, как:
repeat = (n, action) => {
for(i=1; i<=n; ++i) {
console.log(action);
action(i);
}
}
let test_array = [];
repeat(5, function(i) {
test_array.push(i);
})
console.log(test_array);
См .: https://developer.mozilla.org/en-US/docs/Glossary/Callback_function
Переменные экземпляра в ruby могут немного сбивать с толку при первом изучении Ruby, особенно если вы привыкли к другому объектно-ориентированному языку, например Java.
Вы не можете просто объявить переменную экземпляра.
Одна из самых важных вещей, которые нужно знать о переменных экземпляра в ruby, помимо обозначения с префиксом @, заключается в том, что они появляются в первый раз они назначены на .
class Hello
def create_some_state
@hello = "hello"
end
end
h = Hello.new
p h.instance_variables
h.create_some_state
p h.instance_variables
# Output
[]
["@hello"]
Вы можете использовать метод Object # instance_variables
, чтобы перечислить все переменные экземпляра объекта.
Обычно вы «объявляете» и инициализируете все переменные экземпляра в инициализировать метод. Другой способ четко задокументировать, какие переменные экземпляра должны быть общедоступными, - это использовать методы модуля attr_accessor
(чтение / запись), attr_writer
(запись) и attr_reader
(чтение). Эти методы будут синтезировать различные методы доступа для указанной переменной экземпляра.
class Hello
attr_accessor :hello
end
h = Hello.new
p h.instance_variables
h.hello = "hello"
p h.instance_variables
# Output
[]
["@hello"]
Переменная экземпляра все еще не создается до тех пор, пока она не будет назначена для использования синтезированного метода Hello # hello =
.
Еще одна важная проблема, как описано в kch, заключается в том, что вам необходимо знать о различных контекстах, активных при объявлении класса. При объявлении класса получатель по умолчанию (self) во внешней области видимости будет объектом, представляющим сам класс. Следовательно, ваш код сначала создаст переменную экземпляра класса при назначении @hello
на уровне класса.
Внутри методов self будет объектом, для которого вызывается метод,
Вам необходимо добавить метод инициализации
:
class Hello
def initialize
@hello = "hello"
end
def display
puts @hello
end
end
h = Hello.new
h.display
Первый @hello
в вашем коде называется переменной экземпляра класса.
Это переменная экземпляра объекта класса, для которой константа Hello
указывает на. (и который является экземпляром класса Class
.)
Технически, когда вы находитесь в области действия class
, ваше self
устанавливается на объект вашего текущего класса, и @variables
относятся к вашей текущей собственной личности
. Парень, я не в силах объяснить эти вещи.
Вы можете получить все это и многое другое прояснить для вас, посмотрев эту подборку 5-долларовых скринкастов от Прагматических Программистов .
(Или вы можете спросить для уточнения здесь, и я постараюсь обновить.)