Можем ли мы вызвать нормальный конструктор и параматризованный конструктор одновременно в Ruby? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытался так.Имя файла ClassA - instanceAndClassMethods

class ClassA

    def initialize #constructor 
        puts "This is my constructor" 
    end

    def initialize(a,b)
        c=a-b
        puts c
    end
end

Из другого класса, который я назвал выше класса, так как оба находятся в одной папке, например:

require './instanceAndClassMethods' #filename не должно содержать пробелов

obj = ClassA.new #constructor автоматически вызывается при создании объекта

obj=ClassA.new(33,33)

Когда я запускаю из командной строки, я получаю:

Traceback (most recent call last):
        2: from callMeth.rb:4:in `<main>'
        1: from callMeth.rb:4:in `new'
C:/Users/vkuma102/Desktop/Ruby Learning/instanceAndClassMethods.rb:7:in `initial
ize': wrong number of arguments (given 0, expected 2) (ArgumentError)

Если это так, то этотрудно правильно, тогда как мы можем вызвать как обычный конструктор, так и конструктор с параметрами в Java

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

В дополнение к решению о перегрузке , которое предложил Амадан, вы также можете предоставить фабричные методы для дополнения вашего конструктора, например:

class Foo

  def initialize(_a = nil, _b = nil, _c = _nil)
    @a, @b, @c = _a, _b, _c
  end

  # factories
  def self.make_fancy_foo(x,y,z)
    new(bar(x),y+1,baz(z-y))
  end
  def self.make_special_foo(x)
    new(x,x,x)
  end

end

Вот как вы можете их использовать:

foo1 = Foo.new
foo2 = Foo.new(88)
foo3 = Foo.new(3,6,9)
foo4 = Foo.make_fancy_foo(7,-1,5)
foo5 = Foo.make_special_foo(6)
0 голосов
/ 26 февраля 2019

Вы перезаписываете первый конструктор, у вас может быть только один метод на имя в ruby, для достижения желаемого поведения вы можете сделать что-то вроде:

class ClassA
  def initialize(a=nil, b=nil)
    a && b ? puts(a+b) : puts "This is my constructor" 
  end
end

Или:

class ClassA
  def initialize(*args)
    arg.any? ? deal_with_params : puts "This is my constructor" 
  end
end
0 голосов
/ 26 февраля 2019

Нет, в Ruby нет перегрузки методов.В отличие, например, от Java или Crystal, вы получаете только один метод с тем же именем на класс.Ваш второй def перезаписывает первый.Это похоже на запись foo = 7; foo = 19 - значение 7 больше не доступно из foo.

Если вы хотите различать разные списки аргументов, вам нужно сделать это самостоятельно.К счастью, в отличие от Java, Ruby имеет необязательные параметры (то есть параметры со значениями по умолчанию):

class ClassA
  def initialize(a=nil, b=nil)
    if a && b
      c = a - b
      puts c
    else
      puts "This is my constructor" 
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...