2017-11-03 6 views
0

私はruby 1.8.6を使用しています(そこには行かないでください)。私は結果と呼ばれる配列を持っているとしましょう:新しいメソッド "current_page"に応答したいだけです。これは単に数値を返します。Ruby:オブジェクトにメソッドを追加して単純な数値を返す

私は、この値がなりたいものを設定した場合ので、同じように、私は、ローカル変数にそれを持っている:私はmy_array.current_pageを呼び出す場合、私は戻って3を得るように、私の配列を変更したい

page = 3 

、または私のローカル変数pageに保持されている値になることが起こります。

これを行うにはどうすれば最も簡単ですか?これが評価されるとき、@pageの周りではないかもしれない、

@page = page 
def my_array.current_page 
    @page 
end 

しかし:私はこれを試してみました。 @pageの現在の値が何であれ、返すメソッドを「ハードコード」に並べ替える必要があります。

すべての配列オブジェクトで異なる必要があるため、クラスメソッドを設定することはできません。

私は、Arrayクラスにattr_accessorフィールドを追加し、それを設定するのが最善の方法かもしれないと私には思った:my_arrayオブジェクトがクラスを変更する前にインスタンス化されていたので、しかし、それはうまくいくようです:

class Array; attr_accessor :current_page; end 

my_array.current_page = page 
my_array.current_page 
=> 3 

これは実際に動作しているようです。しかし、それは一番良い方法ですか?私のコードの中でArrayをMonkeypatchingするのはかなり恐ろしいことです。あなただけのmy_arrayこのようなモンキーパッチができ

+2

を、なぜあなたは最初の場所で'アレイ#1 current_page'を呼び出すようにしようとしていますか?オリジナルの配列を含むようにいくつかのラッパーオブジェクトを定義することはできませんか? –

+1

最も良い方法は、@ TomLordのようにラッパーを作成することです。これにより、ネイティブ配列からページ分割の問題を分離することができ、複雑さが拡大した場合に柔軟性が向上します – engineersmnky

答えて

2

:あなたは `Array`をモンキーパッチしたくない場合は

my_array = [1,4,6] 
page = 3 

def my_array.current_page=(num) 
    @page = num 
end 
def my_array.current_page 
    @page 
end 

my_array.current_page = page 
p my_array.current_page # =>3 
+1

は 'my_array.singleton_class.class_eval {attr_accessor:current_page}'または 'a.singleton_class.send(:attr_accessor、 :current_page) ' – engineersmnky

+0

ありがとうございます - 猿のパッチが最善の方法ではない場合でも、私はこれが私が*しようとしていたものだと思います。 –

関連する問題