3

selfキーワードがわかりません。

インスタンスメソッドとクラスメソッドを区別するためにどのように使用されるかは理解していますが、メソッド内から使用する場合はどうでしょうか。

何かのようなもの:

def self.name
  self.name = "TEXT"
end

また

def name2
  self.name = "TEXT2"
end

また

class Array
  def iterate!(&code)
    self.each_with_index do |n, i|
      self[i] = code.call(n)
    end
  end
end
4

4 に答える 4

5

通常、selfレシーバーは省略可能であり、そのような場合は通常、省略した方が望ましいです。selfただし、コードを省略すると別の意味になる場合がいくつかあります。

  • そのようなケースの 1 つは、あなたの例のようself.name = ...に、setter メソッドを使用することです。Rubyの構文はメソッド呼び出しと変数呼び出しが曖昧で、変数とメソッドのどちらにも解釈できるものの後に が続く場合は=、ローカル変数代入としての解釈が優先されます。

  • もう 1 つのケースは、メソッドを呼び出したい場合ですclass。キーワードもあり、方法としてはキーワードとしてのclass解釈classが優先されます。

  • さらに別のケースは、メソッドを使用する場合です[]。この表記法は配列リテラルにも使用され、メソッドとしての解釈よりも配列としての解釈が優先されます。

これらのケースのそれぞれで、式を明確にメソッド呼び出しにする必要があります。1 つの方法は、レシーバーが であっても明示的に記述することですself。もう 1 つの方法は()、メソッドの後に記述することです。

example に関してself.each_with_index ...は、self省略できます。省略しないことはお勧めできません。

于 2013-03-08T15:34:35.833 に答える
3

selfインスタンス メソッドとクラス メソッドの違いとはまったく関係ありません。実際、 Ruby にクラス メソッドがないため、両者に違いはありませんRubyにはインスタンスメソッドしかありません。

selfRuby の は、他のすべてのオブジェクト指向言語とまったく同じself(または と呼ばれることもあります) です。現在のオブジェクトへの参照です。thisそれだけです。それは文字通り「自分」への単なるポインタです。

于 2013-03-08T15:29:22.653 に答える
1

self実際に Ruby でスコープを定義します。モジュールからクラス、クラスからメソッドなどに切り替えると、スコープは変化し続けます....

于 2013-03-08T15:15:41.530 に答える
0

クラス メソッド (クラスselfへの参照のため):

class MyClass
  def self.myMethod
    "hello"
  end
end

MyClass.myMethod

のないメソッドselfはインスタンスメソッドです。

class MyClass
  def myMethod
    "hello"
  end
end

c = MyClass.new
c.hello

変数の場合、それはスコープの問題でもあります。クラスにアクセサがある場合は、 でアクセスしますself。使用しないselfということは、通常、メソッドのスコープからローカル変数にアクセスすることを意味します (魔法が与えられていないと仮定します)。

class MyClass
  attr_accessor :var

  def myMethod
    self.var # => "hello"
    var # => undefined
  end
end
于 2013-03-08T15:15:16.197 に答える