2

Rubyは初めてです。私は、他の言語と同じように、Rubyで物事を書き込もうとして失敗している段階にあります。

オブジェクトにメソッドを追加しようとしています。たとえば、控えめな配列です。すべてのアレイではなく、1つの特定のアレイだけです。このメソッドは、外部スコープの変数にアクセスできる必要があります。

私の理解ではdef、オブジェクトにメソッドを追加するために使用できますが、メソッドは外部スコープの変数にアクセスできません。そのためにはlambdaorを使用する必要がありますProc.newが、ラムダ/プロシージャをプロパティとして配列に「アタッチ」する方法がわかりません。

JavaScriptでは、このばかげた例が示すように、これは簡単です。

var x = 3
var array = [1, 2, 3, 4]

array.multiply_by_x = function() {
  var i = this.length
  while (i--) {
    this[i] *= x
  }
}

上記に似たものがRubyで可能ですか?

4

3 に答える 3

4

別のスコープが導入されるため、ここでdefキーワードを使用してメソッドを定義することはできません。特定のオブジェクトのみにメソッドを定義する場合は、シングルトンクラスで定義する必要があります。

x = 3
array = [1, 2, 3, 4]

array.define_singleton_method(:multiply_by_x) do
  self.map!{|e| e * x }
end

ただし、Ruby 1.8.xを使用している場合は、次のことを行う必要があります。

(class << array; self; end).send(:define_method, :multiply_by_x) do
  self.map!{|e| e * x }
end

注:この質問とは関係ありませんが、シングルトンメソッドを定義するさまざまな方法を確認したい場合。

于 2011-10-11T05:32:33.303 に答える
1

モンキーパッチArrayはこれを行いますが、のすべてのインスタンスに対して行いますArray

class Array
  def multiply_by(x)
     self.map! {|n|
        n * x
     }
  end
end

メソッドを既存のオブジェクトに任意にモンキーパッチしたい場合、これは実際には可能ではないと思います。

Hashできることの1つは、lambda:を使用することです。

x = 3
hash = {:array => [1,2,3]}
hash[:multiply_by] = lambda {
   hash[:array].map! {|num|
      num * x
   }
}

multiply_by次に、次のようにラムダを呼び出します。

hash[:multiply_by].call
于 2011-10-11T04:13:31.077 に答える
0

私はむしろそのようにしたいと思います:

ary = [1, 2, 3, 4]

def ary.multyply_by(x)
  self.map! {|e| e * x}
end

p ary.multyply_by 10

補足として、スコープの広い変数よりも関数パラメーターを使用する方がはるかに優れています。スコープは衝突を回避する方法であり、障害物ではありません。

于 2011-10-11T07:15:07.927 に答える