вызов метода суперкласса с изюминкой - PullRequest
1 голос
/ 20 октября 2010

Предположим, у меня есть два класса, вот так:

class Parent
  def say
   "I am a parent"
  end
end

class Child < Parent
  def say
   "I am a child"
  end

  def super_say
   #I want to call Parent.new#say method here
  end
end

Какие есть варианты сделать это? Я думал о:

def super_say
  self.superclass.new.say #obviously the most straight forward way, but inefficient
end

def super_say
 m = self.superclass.instance_method(:say)
 m = m.bind(self)
 m.call
 #this works, but it's quite verbose, is it even idiomatic? 
end

Я ищу способ, который не предполагает псевдонима Parent.new #, скажем что-то еще, что сделало бы его уникальным в цепочке поиска метода (или это действительно предпочтительный способ?) Есть предложения?

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

Я предпочитаю использовать псевдоним. (Я не совсем уверен, что понимаю ваше возражение против этого.)

Пример:

class Child < Parent
  alias :super_say :say

  def say
    "I am a child"
  end
end

Дает:

irb(main):020:0> c = Child.new
=> #<Child:0x45be40c>
irb(main):021:0> c.super_say
=> "I am a parent"
0 голосов
/ 20 октября 2010

Ваше второе решение (bind()) - это то, за которое я бы пошел.Это многословно, потому что то, что вы делаете, очень необычно, но если вам действительно нужно это сделать - это решение мне подходит.

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