В Ruby при инициализации нового класса, который содержит только ноль, почему ноль все еще возвращается после того, как я вставил в него строку? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть следующая библиотека:

class RollCall < Array                                                               

  def initialize(name = nil)                                                         
    @name = name                                                                     
  end                                                                                

  def longest_name                                                                   
    @name                                                                            
  end                                                                                
end 

Наряду со следующими тестами:

gem 'minitest', '~> 5.2'                                                             
require 'minitest/autorun'                                                           
require 'minitest/pride'                                                             
require_relative '../lib/roll_call'                                                  

class RollCallTest < Minitest::Test                                                  
  def test_no_names                                                                  
    roll_call = RollCall.new                                                         
    assert_equal nil, roll_call.longest_name                                         
  end                                                                                

  def test_longest_of_one                                                            
    roll_call = RollCall.new                                                         
    roll_call << 'Oda'                                                               
    assert_equal 'Oda', roll_call.longest_name                                       
  end                                                                                                                                                              
end 

Почему roll_call.longest_name возвращает nil? В IRB он возвращает ['Oda'] (я понимаю, что до сих пор не прошел тест, это как раз то, где я застреваю в пути).

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Почему roll_call.longest_name возвращает nil?

Ваш longest_name метод просто возвращает @name переменную экземпляра. Он устанавливается в initialize, но не при вызове roll_call << 'Oda'. Это потому, что метод << определен в Array, а Array не знает о вашем подклассе или переменной экземпляра @name.

Вы не должны создавать подкласс Ruby core занятия на первом месте. Вместо этого, оберните экземпляр массива внутри вашего класса. Примерно так должно работать:

class RollCall
  def initialize
    @names = []
  end

  def <<(name)
    @names << name
    self             # <- this allows you to chain multiple << calls
  end

  def longest_name
    @names.max_by(&:length)
  end
end

r = RollCall.new
r.longest_name #=> nil

r << 'Bob'
r.longest_name #=> "Bob"
0 голосов
/ 07 апреля 2020

Почему roll_call.longest_name возвращает nil?

RollCall#longest_name просто возвращает значение @name. В вашем коде есть только одно место, где @name изменено, и это RollCall#initialize. Следовательно, единственный способ , который longest_name может когда-либо вернуть что-либо, кроме nil, - это передача аргумента RollCall#initialize, или, скорее, RollCall::new.

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

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