Ruby On Rails: можно ли вызвать метод класса из метода класса? - PullRequest
0 голосов
/ 10 июня 2018

Мне нужно знать, могу ли я вызвать метод класса из метода класса и как.

У меня есть класс в моей модели, и один из моих методов класса становится длинным:

def self.method1(bar)
  # Really long method that I need to split
  # Do things with bar
end

Итак, я хочу разделить этот метод на 2 метода.Нечто подобное

def self.method1(bar)
  # Do things with bar
  # Call to method2
end

def self.method2(bar)
  # Do things
end

Оба они должны быть методами класса

Как я могу назвать этот method2 из method1 ?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Чтобы вы могли понять, что происходит, вы должны проверить область действия внутри метода класса.

class Foo
  def self.bar
    puts self
  end
end

Foo.bar
# => Foo

Когда вызывается Foo.bar, возвращается Foo.Не экземпляр, а класс.Это означает, что вы можете получить доступ к любому методу класса Foo внутри метода self.bar.

class Foo
  def self.bar
    puts "bar was called"
    self.qux
  end

  def self.qux
    puts "qux was called."
  end
end

Foo.bar
# => bar was called
#    qux was called.
0 голосов
/ 10 июня 2018

self в контексте метода класса является сам класс.Таким образом, можно получить доступ к любому методу класса, определенному в текущем классе.Приведенные выше примеры очень полезны, но я хочу дать вам еще один, который немного более понятен (на мой взгляд):

class MyClass
   def self.method1
     p self
     puts "#{method2}"
   end

   def self.method2
     puts "Hello Ruby World!\n I am class method called from another class method!"
   end
 end

MyClass.method1
# => MyClass

# => Hello Ruby World!
     I am class method called from another class method!
0 голосов
/ 10 июня 2018

Здесь ответили: Вызов метода класса в классе

Для повторения:

def self.method1(bar)
  # Do things with bar
  # Call to method2
  method2( bar )
end

Полный пример класса:

class MyClass
  def self.method1(bar)
    bar = "hello #{ bar }!"
    method2( bar )
  end

  def self.method2(bar)
    puts "bar is #{ bar }"
  end
end

MyClass.method1( 'Foo' )
...