Почему в методах класса один метод принимает переменные экземпляра, а другой нет? - PullRequest
1 голос
/ 19 июля 2010

В следующем примере кода почему второй (sheetplus) метод, кажется, получает переменные экземпляра @name и @occupation в порядке, но первый (листовой) метод возвращает nil?Я чувствую, что упускаю что-то смертельно очевидное, но я в основном худший в мире программист на Ruby.

class Test
def initialize(name, occupation)
  @name = name
  @occupation = occupation
def sheet
  "This is #@name, who is a/an #@occupation"
def sheetplus
  "This is #@name, who is a/an #@occupation, but why does this method succeed where the previous one fails?"
end
end
end
end

Ответы [ 4 ]

1 голос
/ 19 июля 2010

Другие люди уже объяснили, в чем заключается ваша проблема, а именно, поместив ваш ends в неправильное место, однако, если вам интересно узнать, почему вы получаете результаты, которые вы получаете, то вот почему.

t = Test.new('Joe', 'Farmer')

Это создает новый экземпляр вашего тестового класса.Инициализатор определил новый метод с именем sheet, который ничего не делает, но определяет метод с именем sheetplus

Если вы сейчас вызовете sheetplus, вы получите ошибку, поскольку метод sheetplus не существуетпока (sheet не был запущен для его создания)

t.sheetplus
NoMethodError: undefined method `sheetplus' for 
  #<Test:0x11a9dec @name="Joe", @occupation="Farmer">
    from (irb):14

Если вы сейчас вызовете sheet, он определит метод sheetplus и вернет результат определения метода (nil)

t.sheet # nil

Если вы теперь вызываете sheetplus, метод существует, поэтому он успешно выполняется

t.sheetplus
=> "This is Joe, who is a/an Farmer, but why does this method succeed 
   where the previous one fails?"
1 голос
/ 19 июля 2010

Вы действительно хотели вкладывать все эти определения?Возможно, вы имели в виду:

class Test
  def initialize(name, occupation)
    @name = name
    @occupation = occupation
  end

  def sheet
    "This is #{@name}, who is a/an #{@occupation}"
  end

  def sheetplus
    "This is #{@name}, who is a/an #{@occupation}, but why does this method succeed where the previous one fails?"
  end
end
0 голосов
/ 19 июля 2010

Потому что ваши ключевые слова находятся не в том месте.Это будет работать так, как вы ожидаете:

class Test
  def initialize(name, occupation)
    @name = name
    @occupation = occupation
  end
  def sheet
    "This is #@name, who is a/an #@occupation"
  end
  def sheetplus
    "This is #@name, who is a/an #@occupation, but why does this method succeed where the previous one fails?"
  end
end
0 голосов
/ 19 июля 2010

Если это код, вставленный напрямую, вы не закрываете определения методов инициализации или листа.

class Test
  def initialize(name, occupation)
    @name = name
    @occupation = occupation
  end
  def sheet
   "This is #@name, who is a/an #@occupation"
  end
  def sheetplus
    "This is #@name, who is a/an #@occupation, but why does this method succeed where the previous one fails?"
  end
end

Кто знает, что может произойти в этот момент.

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