Базовый рубин. Почему этот метод возвращает ноль? - PullRequest
0 голосов
/ 06 июля 2018

Привет!

Я ожидаю #<PrettyThing:0x0055a958175348 @success="anything here">

но вместо этого я получаю 'anything here'. Есть идеи почему?

class Thing
  attr_accessor :success

  def execute
    self.success = execute!
  rescue
    self.success = false
  ensure
    self
  end
end

class PrettyThing < Thing
  def execute!
    'anything here'
  end
end

p PrettyThing.new.execute # => 'anything here'

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Попробуйте:

class Thing
  attr_accessor :success

  def execute
    self.success = execute!
    self
  rescue
    self.success = false
  end
end

class PrettyThing < Thing
  def execute!
    'anything here'
  end
end

p PrettyThing.new.execute # => <PrettyThing:0x0000000379ea48 @success="anything here">

Как написано, execute возвращает результат присваивания self.success = execute!.Добавляя self, вы возвращаете экземпляр PrettyThing.

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

class Thing
  attr_accessor :success

  def execute
    self.success = execute!
    self
  rescue
    self.success = false
  end

  def foo
    puts 'foo'
  end

end

class PrettyThing < Thing
  def execute!
    'anything here'
  end
end

p PrettyThing.new.execute.foo # => foo

Учитывая ваш комментарий, я думаю, что 'd, вероятно, сделал бы что-то более похожее на:

class Thing
  attr_accessor :success

  alias success? success

  def foo
    puts 'foo'
  end

end

class PrettyThing < Thing

  def execute
    @success = everything_worked
    self
  end

private

  def everything_worked
    # your logic goes here
    # return true if all is good
    # return false or nil if all is not good
    true
  end

end

pretty_thing = PrettyThing.new.execute
p pretty_thing.success? # => true

Если everything_worked вернет false или nil, то pretty_thing.success? также вернет false или nil.

0 голосов
/ 06 июля 2018

Убедитесь, что это сложная вещь. Обычно он не возвращает значение, а вместо этого возвращается возвращаемое значение из последней выполненной строки основного блока или блока восстановления, если только не было ошибки, то ошибка возвращается. Но, если вы явно вернетесь, вы получите возвращаемое значение. Это немного нестандартно и сбивает с толку, потому что цель предложения ensure заключается в бесшумной очистке. Возможно, лучше переместить возвращаемое значение за пределы блока begin / rescue.

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