Метод, ссылающийся на метод pull в упаковке, выходит из области видимости, когда помещается внутри метода объектов - PullRequest
0 голосов
/ 22 апреля 2019

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

Как правильно это сделать.Я пытался играть с «я», но я новичок, и это не сработало.

Желаемое решение.Не работает.Возвращает ошибку.

неопределенный метод "account" для nil: NilClass (NoMethodError)

require 'package that has 'accounts''


class Name

    @sandbox = #working API connection

    def get_account
        @sandbox.accounts do |resp|         #This is where error is
          resp.each do |account|

            if account.name == "John"
                name = account.name
            end

          end
        end
    end


end


new = Name.new
p new.get_account

Это работает, но не создает повторно используемый метод.

require 'package that has 'accounts''

class Name

    @sandbox = #working API connection


        @sandbox.accounts do |resp|       
          resp.each do |account|    
            if account.name == "John"
                p account.name
            end
          end
        end




end


new = Name.new

Ответы [ 2 ]

1 голос
/ 22 апреля 2019
  1. Ошибка в коде заключается в том, что @sandbox является атрибутом класса. Значение будет инициализировано при создании объекта класса. Запись инициализации в классе не будет иметь никакого эффекта. @Maxim объяснил это в своем ответе.

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

Код должен быть,

require 'package that has 'accounts''


class Name

    def initialize
      @sandbox = #working API connection
    end

    def get_account
        @sandbox.accounts do |resp|         #This is where error is
          resp.each do |account|

            if account.name == "John"
                name = account.name
            end

          end
        end
    end


end


new = Name.new
p new.get_account
1 голос
/ 22 апреля 2019

Чтобы понять это, вам необходимо понять концепцию одноэлементных классов в Ruby.

Имя класса - это сам объект, а @sandbox - переменная экземпляра этого объекта.

Если вы напишите def self.get_account, вы можете использовать @sandox там, но тогда этот метод недоступен для экземпляров Name, например, вы должны вызвать Name.get_account, а не Name.new.get_account.Фактически, это добавляет метод к одноэлементному классу Name, и поэтому вы можете получить доступ к @sandbox там.

Чтобы создать переменную экземпляра, которая может использоваться в экземплярах Name, вы должны сделать этов initialize методе Name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...