Nice programing

Ruby에서 초기화 생성자를 오버로드하는 방법이 있습니까?

nicepro 2020. 11. 11. 20:42
반응형

Ruby에서 초기화 생성자를 오버로드하는 방법이 있습니까?


Java에서는 생성자를 오버로드 할 수 있습니다.

public Person(String name) {
  this.name = name;
}
public Person(String firstName, String lastName) {
   this(firstName + " " + lastName);
}

Ruby에서 이와 동일한 결과를 얻을 수있는 방법이 있습니까? 다른 인수를 사용하는 두 개의 생성자입니다.


대답은 예와 아니오입니다.

다음과 같은 다양한 메커니즘을 사용하여 다른 언어에서와 동일한 결과를 얻을 수 있습니다.

  • 인수의 기본값
  • 변수 인수 목록 (splat 연산자)
  • 인수를 해시로 정의

언어의 실제 구문에서는 인수가 다르더라도 메서드를 두 번 정의 할 수 없습니다.

위의 세 가지 옵션을 고려하면 다음과 같이 예제로 구현할 수 있습니다.

# As written by @Justice
class Person
  def initialize(name, lastName = nil)
    name = name + " " + lastName unless lastName.nil?
    @name = name
  end
end


class Person
  def initialize(args)
    name = args["name"] + " " + args["lastName"] unless args["lastName"].nil?
    @name = name
  end
end

class Person
  def initialize(*args)
    #Process args (An array)
  end
end

두 번째 메커니즘은 Ruby 코드 내에서, 특히 Rails 내에서 자주 접하게 될 것입니다.이 메커니즘은 두 세계의 장점을 모두 제공하고 일부 구문 설탕이 예쁜 코드를 생성 할 수 있도록합니다. 특히 전달 된 해시를 중괄호로 묶지 않아도됩니다.

위키 북 링크 는 더 많은 정보를 제공합니다.


나는하는 경향이있다

class Person
  def self.new_using_both_names(first_name, last_name)
    self.new([first_name, last_name].join(" "))
  end

  def self.new_using_single_name(single_name)
    self.new(single_name)
  end

  def initialize(name)
    @name = name
  end
end

하지만 이것이 최선의 방법인지는 모르겠습니다.


class Person
  def initialize(name, lastName = nil)
    name = name + " " + lastName unless lastName.nil?
    @name = name
  end
end

class StatementItem
  attr_reader :category, :id, :time, :amount

  def initialize(item)
    case item
    when Order
      initialize_with_order(item)
    when Transaction
      initialize_with_transaction(item)
    end
  end

  def valid?
    !(@category && @id && @time && @amount).nil?
  end

  private
    def initialize_with_order(order)
      return nil if order.status != 'completed'
      @category = 'order'
      @id = order.id
      @time = order.updated_at
      @amount = order.price
    end

    def initialize_with_transaction(transaction)
      @category = transaction.category
      @id = transaction.id
      @time = transaction.updated_at
      @amount = transaction.amount
    end

end

konstructor gem을 사용 하여 Ruby에서 여러 생성자를 선언하고 오버로딩을 모방 할 수 있습니다 .

class Person
  def initialize(name)
    @name = name
  end

  konstructor
  def from_two_names(first_name, last_name)
    @name = first_name + ' ' + last_name
  end
end

Person.new('John Doe')
Person.from_two_names('John', 'Doe')

나는 보통 :

class Person
  attr_reader :name
  def initialize(first: nil, last: nil)
    @name = [first, last].compact.join(' ')
  end
end

Person.new(first: 'ya').name
# => "ya"

Person.new(first: 'ya', last: 'ku').name
# => "ya ku"

체크 아웃 기능 - 루비 엘릭서에서 영감을 보석 패턴 매칭 기능.

   클래스 Foo
     기능 :: PatternMatching 포함

     defn (: initialize) {@name = 'baz'}
     defn (: 초기화, _) {| 이름 | @name = name.to_s}
   종료

참고URL : https://stackoverflow.com/questions/3958735/in-ruby-is-there-a-way-to-overload-the-initialize-constructor

반응형