Ruby setter成语

Lai*_*ira 3 ruby setter idioms

我工作的一Chart类,它有一个margin参数,保存:top,:bottom,:right:left值.我的第一个选择是创建margin一个setter并设置如下值:

# Sets :left and :right margins and doesn't alter :top and :bottom 
chart.margins = {:left => 10, :right => 15}
Run Code Online (Sandbox Code Playgroud)

这很好,因为它显然是一个制定者,但是,经过一番思考,我认为它也可能令人困惑:用户可能认为边距只包含:left:right值,什么是不对的.另一种选择是消除=并使其成为一种普通的方法:

chart.margins(:left => 10, :right => 15)
Run Code Online (Sandbox Code Playgroud)

使用这种语法,很容易弄清楚发生了什么,但它不是标准的setter并且与marginsgetter 冲突.而且还有另一种选择:

chart.margins(:left, 10)
chart.margins(:right, 15)
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么想.对我来说,很明显这个方法是一个setter,但这次我不能只用一次调用设置多个值,而getter又有问题.我对Ruby比较陌生,我还没有习惯所有的习语.所以,你觉得男人们怎么样?哪个是最好的选择?

par*_*tic 5

您还可以创建Margin类以享受以下清晰语法:

class Margin
    attr_accessor :left, :right, :top, :bottom
    ...
end

class Chart
    attr_accessor :margins
    ...
 end


chart.margins.left = 10
puts chart.margins.right
Run Code Online (Sandbox Code Playgroud)