kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 IttayD
IttayD
Вопрос

вызов другого метода в суперклассе в ruby

класс A
  def a
    помещает 'в #a'
  end
end

класс B < A def a b() end def b

здесь я хочу вызвать A#a.

end end

47 2009-08-09T11:12:09+00:00 3
Программирование
ruby
Решение / Ответ
 Beffa
Beffa
9-го августа 2009 в 11:43
2009-08-09T11:43:38+00:00
Дополнительно
Источник
Редактировать
#9351791
class B < A

  alias :super_a :a

  def a
    b()
  end
  def b
    super_a()
  end
end  
80
0
 sepp2k
sepp2k
9-го августа 2009 в 11:23
2009-08-09T11:23:26+00:00
Дополнительно
Источник
Редактировать
#9351790

Красивого способа сделать это нет, но вы можете сделать A.instance_method(:a).bind(self).call, что будет работать, но некрасиво.

Вы даже можете определить свой собственный метод в Object, чтобы действовать как super в java:

class SuperProxy
  def initialize(obj)
    @obj = obj
  end

  def method_missing(meth, *args, &blk)
    @obj.class.superclass.instance_method(meth).bind(@obj).call(*args, &blk)
  end
end

class Object
  private
  def sup
    SuperProxy.new(self)
  end
end

class A
  def a
    puts "In A#a"
  end
end

class B<A
  def a
  end

  def b
    sup.a
  end
end
B.new.b # Prints in A#a
 sepp2k
sepp2k
Редактировал ответ 9-го августа 2009 в 11:45
30
0
 kernelsmith
kernelsmith
21-го апреля 2015 в 4:33
2015-04-21T16:33:20+00:00
Дополнительно
Источник
Редактировать
#9351792

Если вам не нужно явно вызывать A#a из B#b, а нужно вызвать A#a из B#a, что, по сути, вы и делаете через B#b (если только ваш пример не достаточно полный, чтобы продемонстрировать, почему вы вызываете из B#b, вы можете просто вызвать super из B#a, как это иногда делается в методах initialize. Я знаю, что это очевидно, но я просто хотел уточнить для новичков в Ruby, что вы не обязаны использовать псевдоним (в частности, это иногда называется "вокруг псевдонима") в каждом случае.

class A
  def a
    # do stuff for A
  end
end

class B < A
  def a
    # do some stuff specific to B
    super
    # or use super() if you don't want super to pass on any args that method a might have had
    # super/super() can also be called first
    # it should be noted that some design patterns call for avoiding this construct
    # as it creates a tight coupling between the classes.  If you control both
    # classes, it's not as big a deal, but if the superclass is outside your control
    # it could change, w/o you knowing.  This is pretty much composition vs inheritance
  end
end
0
0
Похожие сообщества 6
Чат по Руби
Чат по Руби
2 350 пользователей
Чат-болталка для учеников руби-школы и не только. Сайт школы: https://rubyschool.us Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13 или тут https://graph.org/Pravila-chata-Rubi-shkoly-03-13
Открыть telegram
RubyRush.ru
RubyRush.ru
2 295 пользователей
Дружелюбный чат для начинающих программистов и учеников rubyrush.ru, обсуждаем программирование, ruby и т. п. Правила чата https://telegra.ph/22-09-05-3 Популярные вопросы (с ответами) https://telegra.ph/22-09-17-4 💎🦜
Открыть telegram
pro.rb (Ruby/Rails / RU)
pro.rb (Ruby/Rails / RU)
1 183 пользователей
Язык программирования Ruby: https://ru.wikipedia.org/wiki/Ruby Вакансии: @rubyjob
Открыть telegram
Ruby — вакансии и аналитика
Ruby — вакансии и аналитика
359 пользователей
Публикуем вакансии и запросы на поиск работы по направлению Ruby. Full-time, part-time, remote и разовые подработки. Обмен инсайдами и аналитикой на рынке труда. Тематическое общение: @ruby_ru См. также: @python_jobs, @nodejs_jobs, @devops_jobs
Открыть telegram
Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
345 пользователей
Открыть telegram
Ruby Talks
Ruby Talks
255 пользователей
Национальная Флеймотека
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 17 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией