Generic scope

제네릭 매개변수는 선언된 위치가 곧 적용 범위다

`T`, `U`, `X1`, `Y2` 같은 이름은 타입의 종류가 아니라, 어느 선언이 어떤 타입 관계를 붙잡는지 보여주는 자리표시자입니다.

fn

함수에 묶임

fn largest<T>(...)

호출마다 `T`가 정해지고, 입력과 반환 타입의 관계를 하나로 유지합니다.

struct

타입에 묶임

struct Point<T, U>

인스턴스가 만들어질 때 필드별 구체 타입이 고정됩니다.

impl

구현 블록에 묶임

impl<T> Point<T>

모든 `Point`에 공통 메서드를 붙이거나, 특정 타입만 골라 구현합니다.

method

메서드에만 묶임

fn mixup<X2, Y2>

`self`의 타입과 인수 타입을 조합해 새 반환 타입을 만들 수 있습니다.

입력 관계

self: Point<X1, Y1>
other: Point<X2, Y2>

구조체의 제네릭과 메서드의 제네릭이 서로 다른 소스에서 옵니다.

반환 관계

Point<X1, Y2>

`x`는 기존 점에서, `y`는 다른 점에서 가져오므로 반환 타입도 그 관계를 그대로 표현합니다.

읽는 요령: 꺾쇠괄호가 붙은 위치를 먼저 찾고, 그 이름이 함수 전체인지, 타입 전체인지, 특정 메서드 안에서만 유효한지 분리해서 보면 됩니다.