首页 > 解决方案 > Ruby setter 的返回值

问题描述

我读到这attr_writer :age是简写:

def age=(value)
  @age = value
end

所以我创建了一个具有如下函数的类:

    def age=(value)
        if @age == -1
            @age = value
            return true
        end

        return false
    end

然后我想在另一个地方这样称呼它:

rv = Foo.age(1)
# do stuff with rv

但我收到一个错误:

  ArgumentError:
       wrong number of arguments (given 1, expected 0)

无论如何,我可以做类似的事情,Foo.age = 1但这并不能让我控制返回值。这里正确的惯用 Ruby 是什么?

标签: ruby

解决方案


一个执行两个步骤的包装器方法怎么样:首先它会尝试设置值age=然后验证它age == new_value并返回,这样你就可以知道设置器是否成功。

class Foo
 def age=(val)
  # do a bunch of complicated networking that was non-deterministic
  # return true/false
 end
 
 def set_age(val)
   self.age = val
   @age == val
 end
end

foo = Foo.new
result = foo.set_age(1)

您还可以通过引发错误来替换 true/false,然后您可以将 setter 包装到 begin-end 块中

class Foo
  def age=(val)
   # do a bunch of complicated networking that was non-deterministic
   raise RuntimeError
  end
end

result = begin
 foo.age = 1
 true
rescue => e
 false
end

推荐阅读