Ruby-спасательный синтаксис - PullRequest
0 голосов
/ 12 марта 2012

Я хотел бы реализовать что-то с похожим на спасение синтаксисом.

begin
 raise "Failed"
rescue Exception => e
 puts e
end

Это работает, и e присваивается соответствующее значение. Но используемый в методе, это вызовет исключение, говорящее, что e не определено. Другими словами, как спасение может назначить что-то таким образом, не выдавая неопределенную ошибку?

class MyClass
  def to_s
    "hello"
  end
end

def my_method
  puts e.to_s
end

my_method(MyClass => e)

#=> undefined local variable or method `e' for main:Object

1 Ответ

1 голос
/ 12 марта 2012

Возможно, вы ищете:

class MyClass
  def self.hello
    puts "This is a class method."
  end
  def bye
    puts "This is an instance method."
  end
end

def my_method(params)
  klass = params[:class]
  puts klass.hello   # Call a class method
  inst = klass.new   # Create an instance
  puts inst.bye      # Call an instance method
end 

my_method(:class => MyClass)

Три вещи, на которые стоит обратить внимание:

  • Хотя синтаксис rescue и синтаксис "именованного параметра" выглядят одинакововсе, что у них общего, это оператор =>.В первом случае вы указываете rescue Exception "в" переменную e, эффективно сохраняя ее в этой переменной.Во втором случае вы говорите Ruby собрать все параметры, переданные методу, и сохранить их в хэше, используя предоставленные пары ключ / значение.Фактически, вы храните MyClass в хеше params под ключом :class.
  • . В приведенном выше примере определение to_s не будет вызываться для самого MyClass, поскольку выопределил это как метод экземпляра.Методы экземпляра доступны только при создании «экземпляра» класса с inst = MyClass.new.Затем вы можете позвонить inst.to_s.Думайте о классе как об абстрактном «типе» вещи, а об экземпляре как о конкретной вещи этого типа.Если вы хотите, чтобы метод был доступен в классе, а не в экземплярах, вам нужно добавить к нему префикс self.. Я проиллюстрировал два различных синтаксиса выше.
  • Опять в вашем примере вы используете def MyClass, который Ruby будет интерпретировать как «определить метод с именем MyClass».Если вы хотите определить класс, вам нужно использовать class MyClass.

Надеюсь, это немного прояснит ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...