Skip to content

252페이지 클로저를 이용한 생성기 문의드립니다. #2

@kimhongsu

Description

@kimhongsu

p.252 콜백 함수를 받아서 동작하게 만든다면 위의 방법과 거의 동일하게 구현이 가능합니다.

라고 설명해주셨는데, 콜백을 이용해서 어떻게 구현해야할지 모르겠습니다.

클로저를 이용하려면 함수를 리턴하는 패턴일거고, 리턴 되는 함수와 매칭된 변수들이 있어서 그 변수들을 이용해야 할거라고 예측은 됩니다.
리턴된 함수를 콜 할 때마다 알맞는 결과가 한 번씩 반환되어야 할거라고 생각되는데요.
아래처럼 작성해봤는데, 예쁘지 않아서 마음에 들지 않습니다.
좋은 방법을 알려주세요.

func BabyNamesGenerator(first, second string) func() string {
	len_first := len([]rune(first))
	len_second := len([]rune(second))
	next, i, j := 0, 0, 0

	return func() string {
		if next == len_first*len_second {
			return ""
		}

		name := string([]rune(first)[i]) + string([]rune(second)[j])
		next++
		j++
		i = j / len_second
		j = j % len_second
		return name
	}
}

func Example_BabyNamesGenerator() {
	get_names := BabyNamesGenerator("성정명재경", "준호우훈진")
	for name := get_names(); name != ""; name = get_names() {
		fmt.Print(name, ",")
	}
	// Output:
	// 성준,성호,성우,성훈,성진,정준,정호,정우,정훈,정진,명준,명호,명우,명훈,명진,재준,재호,재우,재훈,재진,경준,경호,경우,경훈,경진,
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions