3

私はChartクラスに取り組んでおり、 、、および値marginを保持するパラメーターがあります。私の最初のオプションは、セッターを作成し、次のように値を設定することでした::top:bottom:right:leftmargin

# Sets :left and :right margins and doesn't alter :top and :bottom 
chart.margins = {:left => 10, :right => 15}

これは明らかにセッターなのでいいのですが、少し考えてみると、混乱を招く可能性もあると思います。ユーザーは、マージンには:leftと の:right値しか含まれていないと考えるかもしれません。何が正しくないのでしょう。別のオプションは、削除=して通常の方法にすることです。

chart.margins(:left => 10, :right => 15)

この構文を使用すると、何が起こっているかを簡単に把握できますが、標準のセッターではなく、marginsゲッターと競合します。そして、まだ別のオプションがあります:

chart.margins(:left, 10)
chart.margins(:right, 15)

これについてどう考えればいいのかわからない。私にとっては、メソッドがセッターであることは明らかですが、今回は1回の呼び出しで複数の値を設定できず、ゲッターの問題が再び発生しました。私は Ruby に比較的慣れていないので、まだすべてのイディオムに慣れていません。それで、あなたはどう思いますか?最良の選択肢はどれですか?

4

5 に答える 5

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
于 2009-11-30T12:36:18.380 に答える
3

これがあなたが利用可能にしたい種類の構文であるかどうかはわかりません(そうでない場合は申し訳ありません: )

#!/usr/bin/ruby
class Margins < Struct.new(:top, :bottom, :left, :right) 
end

class Chart
  attr_reader :margins

  def initialize()
    @margins = Margins.new(0,0,0,0)
  end

  def margins=(hash)
    [:top, :bottom, :left, :right].each do |dir|
      if (hash[dir])
        @margins[dir] = hash[dir]
      end
    end
  end
end

c = Chart.new
c.margins.left = 10
c.margins={:top=>12,:bottom=>13}
puts c.margins.left
# 10
puts c.inspect;
# #<Chart:0xb7caaf8c @margins=#<struct Margins top=12, bottom=13, left=10, right=0>>

# However c.margins.foo = 12 would give you an error
于 2009-11-30T13:35:58.770 に答える
2

パラダイムの答えに加えて、以下をサポートするメソッドをMarginsクラスに追加できます。

chart.margins.set :left => 10, :right => 15

margins =メソッドを拡張して、数値引数を処理できます。

chart.margins = 20

砂糖として:

chart.margins = Margins.new(20, 20, 20, 20)
于 2009-11-30T12:52:22.993 に答える
2

Margin のクラスを作成するのはやり過ぎだとは思いません。または同様のものを使用して、いつでもその値をハッシュとして公開できますto_hash

また、必要に応じて、DSL スタイルで動作させることもできます。

chart.margins do |m|
  m.left 10
  m.right 20
  m.vertical 5 # sets both top and bottom margin
end

しかし、とにかくパラダイムのアプローチを選択すると思います...

于 2009-11-30T16:34:11.953 に答える
1

最初に持っていたものに固執して、通常のハッシュ構文を使用することもできます。

margins["left"] = 10  #to set just one without changing the others
于 2009-11-30T17:10:39.413 に答える