Когда переменные экземпляра Ruby становятся установленными?

В вашем фрагменте кода 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

65
задан pez_dispenser 5 May 2009 в 20:16
поделиться

3 ответа

Переменные экземпляра в 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 будет объектом, для которого вызывается метод,

91
ответ дан 24 November 2019 в 15:16
поделиться

Вам необходимо добавить метод инициализации :

class Hello
    def initialize
        @hello = "hello"
    end
    def display
        puts @hello
    end
end

h = Hello.new
h.display
42
ответ дан 24 November 2019 в 15:16
поделиться

Первый @hello в вашем коде называется переменной экземпляра класса.

Это переменная экземпляра объекта класса, для которой константа Hello указывает на. (и который является экземпляром класса Class .)

Технически, когда вы находитесь в области действия class , ваше self устанавливается на объект вашего текущего класса, и @variables относятся к вашей текущей собственной личности . Парень, я не в силах объяснить эти вещи.

Вы можете получить все это и многое другое прояснить для вас, посмотрев эту подборку 5-долларовых скринкастов от Прагматических Программистов .

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

22
ответ дан 24 November 2019 в 15:16
поделиться
Другие вопросы по тегам:

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