반응형
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}
종료
반응형
'Nice programing' 카테고리의 다른 글
| 부트 스트랩 3 모달이 실행되고 페이지가 일시적으로 왼쪽으로 이동 함 / 브라우저 스크롤바 문제 (0) | 2020.11.12 |
|---|---|
| SBT 오류 :“터미널을 구성하지 못했습니다. (0) | 2020.11.12 |
| 기본 인증을위한 사용자 계정은 어떻게 생성합니까? (0) | 2020.11.11 |
| Max-Heapify의 최악의 경우-어떻게 2n / 3을 얻습니까? (0) | 2020.11.11 |
| Bash에서 함수를 종료하는 방법 (0) | 2020.11.11 |