Попробуйте:
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
.