Всего новичков: переменные экземпляра в рубине?

Просто напишите ng-click перед href .. Он работал для меня

<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@1.5.0" data-semver="1.5.0" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
    <script>
    angular.module("module",[])
.controller("controller",function($scope){
  
  $scope.func =function(){
    console.log("d");
  }
  
})</script>
  </head>

  <body ng-app="module" ng-controller="controller">
    <h1>Hello ..</h1>
    <a ng-click="func()" href="someplace.html">Take me there</a>
  </body>

</html>

13
задан Andrew Grimm 28 September 2011 в 00:08
поделиться

4 ответа

Давайте пройдемся по коду, не так ли?

#bowling.rb

class Bowling
  @game_score = 0 # (1)

На данный момент (1) мы все еще находимся внутри класса Bowling . Помните: классы - это такие же объекты, как и любые другие. Итак, на этом этапе вы назначаете 0 переменной экземпляра @game_score объекта класса Bowling .

 def hit(pins)
  @game_score = @game_score + pins # (2)

Теперь (2) мы внутри метод экземпляра класса Bowling . То есть: это метод, который будет принадлежать экземпляру из Bowling . Итак, теперь переменная экземпляра @game_score принадлежит экземпляру класса Bowling , а не самому классу.

Начиная с это переменная экземпляра никогда ничем не инициализируется, она будет оцениваться как nil (в Ruby, неинициализированные переменные всегда оцениваются как nil ), поэтому это оценивается как @game_score = nil + pins и поскольку nil не имеет метода # + , это приведет к возникновению исключения NoMethodError .

 end
 def score
  @game_score # (3)

И здесь (3) мы снова находимся внутри метода экземпляра класса Bowling . Это всегда будет оцениваться как nil по причине, которую я указал выше: @game_score никогда не инициализируется, поэтому он оценивается как nil .

 end
end

Мы можем использовать Возможности отражения в Ruby, чтобы взглянуть на то, что происходит:

p Bowling.instance_variable_get(:@game_score) # => 0
b = Bowling.new
p b.instance_variable_get(:@game_score) # => nil

Теперь давайте добавим значение в переменную экземпляра:

b.instance_variable_set(:@game_score, 1)
p b.score # => 1
b.hit(3)
p b.score # => 4

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

Для этого нам нужно написать метод инициализатора. Как ни странно, метод инициализатора на самом деле является частным методом экземпляра с именем initialize . (Причина, по которой initialize является методом экземпляра, а не методом класса, на самом деле довольно проста. Ruby разделяет создание объекта на две фазы: выделение памяти и инициализация объекта. Выделение памяти выполняется методом класса , называемым alloc , а инициализация объекта выполняется методом экземпляра с именем initialize . (Программисты Objective-C это поймут.) Причина, по которой alloc является методом класса, просто в том, что на данный момент выполнения экземпляра еще нет. И причина того, что initialize является методом экземпляра, заключается в том, что инициализация объекта, очевидно, выполняется для каждого объекта. Для удобства существует стандартный метод фабричного класса под названием new , который вызывает для вас как alloc , так и initialize .)

class Bowling
 def initialize
  @game_score = 0
 end
end

Давайте проверим это:

c = Bowling.new
p c.score # => 0
c.hit(2)
p c.score # => 2

] Кстати: просто несколько небольших советов по стилю Ruby: отступ составляет 2 пробела, а не 1 табуляция.

37
ответ дан 1 December 2019 в 17:20
поделиться

Потому что у вас нет

def initialize
  @game_score = 0
end

Назначение в определении класса не делает то, что вы думаете, и когда попадание вызывается, оно не может добавьте к nil .

Если вы теперь спросите , что случилось с @game_score ? , хорошо, всегда помните Класс - это объект и Object - это класс .

Это здорово, как классы Ruby имеют это «реальное» существование в стиле Дзен. Ruby не имеет точно именованных классов, скорее, имена классов являются ссылками на объекты класса Class . Назначив @game_score вне метода экземпляра, вы создали переменную экземпляра класса , атрибут объекта класса Bowling , который является экземпляром класса Class . В общем, эти объекты не очень полезны. (См. Главу 1, Путь Рубина , Хэл Фултон.)

16
ответ дан 1 December 2019 в 17:20
поделиться

@game_score , определенная там, называется переменной экземпляра класса , которая является переменной, определенной для объекта одноэлементного класса:

class << Bowling
  attr_accessor :game_score
end

Bowling.game_score #=> 0

Это, как вы можете сказать, разные из обычных переменных экземпляра , определенных для экземпляров объектов.

9
ответ дан 1 December 2019 в 17:20
поделиться

@game_score здесь никогда не получит нулевое значение - вам нужно поместить его в initialize, как в

def initialize @game_score = 0 конец

0
ответ дан 1 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

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