Move 2024년으로 마이그레이션

Move 2024는 메서드 구문, 위치 필드, 루프 레이블 등 새로운 기능을 제공합니다.

Move 2024년으로 마이그레이션

2024 에디션으로 마이그레이션 Move 2024 에디션 는 Move 을 더 쓰기 쉽고 읽기 쉽게 만드는 변경 사항을 소개합니다. 소스 언어의 획기적인 변경 사항이 상대적으로 적어 Move 이 향후 발전된 기능을 처리할 수 있는 더 나은 위치에 있습니다.

이러한 변경 사항 중 상당수는 소스 언어를 개선하여 체인에 게시된 바이너리 표현을 변경하지 않고도 컴파일러에 영향을 미칩니다.

이러한 새로운 기능이 추가되더라도 기존 코드는 계속 컴파일됩니다. 또한 이러한 기능은 선택 사항이기 때문에 종속성에 해당 기능이 포함되어 있지 않더라도 새 기능을 사용하여 패키지를 작성할 수 있습니다. 그러나 현재 모듈에서 새 기능을 활용하도록 선택하면 몇 가지 중요한 변경 사항이 발생합니다.

마이그레이션 가이드 읽기 마이그레이션 가이드 에서 마이그레이션 가이드를 읽어보세요.

마이그레이션하는 방법

프로젝트를 Move 2024 베타로 마이그레이션하려면 두 가지 옵션이 있습니다:

  1. 기존 Move.lock 파일(있는 경우)을 확인하여 최신 버전을 사용하고 있는지 확인합니다. sui-프레임워크 버전입니다.
  2. 실행 sui 이동 마이그레이션 를 Move 프로젝트의 루트에 추가합니다. 프로젝트의 자동 마이그레이션 마이그레이션 가이드의 섹션을 참조하세요.
    1. 또는 Move.toml 파일의 [패키지] 포함할 항목 edition = "2024.beta". 이렇게 하면 여러 가지 새로운 오류가 발생할 수 있습니다. 획기적인 변화.

자동 마이그레이션 

Move 2024에는 다음을 호출하여 사용할 수 있는 자동 마이그레이션 스크립트가 포함되어 있습니다. sui 이동 마이그레이션 를 Move 프로젝트의 루트에 추가합니다. 실행하면 콘솔에서 사용할 Move 에디션을 묻는 메시지가 표시됩니다. 다음을 선택하면 2024.beta로 설정하면 스크립트는 컴파일러를 호출하고 코드를 자동으로 업데이트하여 획기적인 변화 이 업데이트는 구조체를 다음과 같이 표시하는 것을 포함하여( 공개를 사용하여 가변 변수를 mut 키워드, 제한된 키워드 피하기, 스와핑 친구 에 대한 공개(패키지)를 사용하여 경로를 전역 경로로 업데이트할 수도 있습니다.)

이 스크립트가 실행되면 콘솔에 스크립트가 수행하려는 변경 사항이 표시됩니다. 변경 사항을 수락하면 스크립트가 코드를 업데이트하고 Move.toml 파일을 자동으로 업데이트합니다. 현재 Move 2024 베타를 사용 중입니다.

새로운 기능

다음은 Move 2024의 새로운 기능 중 일부에 대한 간략한 개요입니다.

메서드 구문

이제 특정 함수를 메서드로 호출할 수 있습니다. . 구문을 사용합니다. 예를 들어 다음과 같은 호출이 있습니다:

벡터::푸시백(&mut v, 코인::값(&c));

로 작성할 수 있습니다:

v.push_back(c.value());

메서드의 수신자(v 그리고 c )는 필요한 경우 자동으로 빌려집니다( &mut v 그리고 &c 각각).

수신자를 첫 번째 인수로 받는 경우 수신자의 유형과 동일한 모듈에 정의된 모든 함수를 메서드로 호출할 수 있습니다.

모듈 외부에 정의된 함수의 경우 다음을 사용하여 메서드를 선언할 수 있습니다. 공용 사용 재미 그리고 재미 사용.

인덱스 구문

메서드 구문을 사용하면 특정 함수에 다음과 같은 주석을 달 수 있습니다. #[syntax(index)] 메서드를 호출합니다. 그런 다음 다음을 사용하여 이러한 메서드를 호출합니다. v[i]-스타일 통화.

예를 들어

*&mut v[i] = v[j];

는 다음과 같이 결의합니다.

*vector::borrow_mut(&mut v, i) = *vector::borrow(&v, j);

공개(패키지)

친구 선언 및 관련 공개(친구) 가시성 수정자는 더 이상 사용되지 않습니다. 그 대신에 공개(패키지) 가시성 수정자를 사용하여 함수가 정의된 동일한 패키지 내에서만 함수를 호출할 수 있습니다.

위치 필드

이제 0 기반 인덱스로 액세스하는 위치 필드가 있는 구조체를 정의할 수 있습니다. 예를 들어

공용 구조체 Pair(u64, u64)에는 복사, 삭제, 저장 기능이 있습니다;

를 클릭한 다음 각 필드에 액세스합니다,

public fun sum(p: &Pair): u64 {
  p.0 + p.1
}

이 예제에서 볼 수 있듯이 이제 구조 필드 목록 뒤에 어빌리티를 선언할 수 있습니다.

중첩 사용 및 표준 라이브러리 기본값

이제 중첩할 수 있습니다. 사용 별칭을 사용하면 더욱 간결해집니다.

use sui::{balance, coin::{Self, Coin}};

또한 이제 모든 모듈에 다음과 같은 사용 선언이 자동으로 포함됩니다:

use std::vector;
use std::option::{Self, Option};
use sui::object::{Self, ID, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};

동일성에서 자동 참조

평등 연산, == 그리고 !=이제 한쪽이 참조이고 다른 쪽이 참조가 아닌 경우 자동으로 빌려옵니다. 예를 들어

fun check(x: u64, r: &u64): bool {
  x == r
}

은 다음과 같습니다.

fun check(x: u64, r: &u64): bool {
  &x == r
}

이 자동 차용은 다음 중 어느 쪽에서든 발생할 수 있습니다. == 그리고 !=.

루프 레이블

루프를 중첩할 때는 바깥쪽 루프로 끊는 것이 편리할 수 있습니다. 예를 들어

let mut i = 0;
let mut j = 0;
let mut terminate_loop = false;
while (i < 10) {
    while (j < 10) {
        if (haystack(i, j) == needle) {
            terminate_loop = true;
            break;
        };
        j = j + 1;
    };
    if (terminate_loop) break;
    i = i + 1;
}

이제 외부 루프에 직접 이름을 지정할 수 있습니다(outer )을 한꺼번에 끊어버릴 수 있습니다:

let mut i = 0;
let mut j = 0;
'outer: while (i < 10) {
    while (j < 10) {
        if (haystack(i, j) == needle) break'outer;
        j = j + 1;
    };
    i = i + 1;
}

break 가치 있는

이제 루프의 값으로 중단할 수 있습니다. 예를 들어

let mut i = 0;
let x: u64 = loop {
    if (v[i] > 10) break i;
    i = i + 1;
};

레이블을 통해서도 이를 달성할 수 있습니다. 예를 들어

let mut i = 0;
let mut j = 0;
let item = 'outer: loop {
    while (j < 10) {
        let item = haystack(i, j);
        if (item == needle) break'outer option::some(item);
        j = j + 1;
    };
    i = i + 1;
    if (i == 10) break option::none();
};

주요 변경 사항 

안타깝게도 2024년( Move )에는 급격한 변화가 예상됩니다. 이러한 변경은 최소한의 침습적 변경으로 예상되며 대부분의 경우 자동화할 수 있는 마이그레이션 스크립트를 제공합니다. 또한 이러한 변화는 Move 2024에 추가될 새로운 기능을 위한 기반을 닦는 작업이기도 합니다.

데이터 유형 가시성 요구 사항

현재 Move 의 모든 구조체는 관례상 공개 구조체이므로 다른 모듈이나 패키지는 이를 가져와서 유형별로 참조할 수 있습니다. 이를 보다 명확히 하기 위해 Move 2024에서는 모든 구조체를 public 키워드로 선언해야 합니다. 예를 들어

// legacy code
struct S { x: u64 }

// Move 2024 code
public struct S { x: u64 }

현재 공개되지 않은 구조에서는 오류가 발생하지만 Move 팀에서 향후 릴리스를 위한 새로운 가시성 옵션을 개발 중입니다.

변경 가능성 요구 사항

이전에는 Move 의 모든 변수가 암시적으로 변경 가능했습니다. 예를 들어

fun f(s: S, y: u64): u64 {
    let a = 0;
    let S { x } = s;
    a = 1;
    x = 10;
    y = 5;
    x + y
}

이제 가변 변수를 명시적으로 선언해야 합니다:

fun f(s: S, mut y: u64): u64 {
    let mut a = 0;
    let S { mut x } = 5;
    a = 1;
    x = 10;
    y = 5;
    x + y
}

이제 컴파일러는 이 명시적 선언 없이 변수를 변경 가능하게 재할당하거나 차용하려고 하면 오류를 생성합니다.

친구 삭제하기 및 공개(친구)

친구와 공개(친구) 가시성은 Move 개발 초기에 도입되어 패키지 시스템보다 앞서 도입되었습니다. 에서 볼 수 있듯이 공개(패키지) 섹션으로 이동합니다, 공개(패키지) 더 이상 사용되지 않음 공개(친구) Move 2024년.

이제 다음 선언이 오류를 생성합니다:

module pkg::m {
    friend pkg::a;
    public(friend) fun f() { ... }
}

module pkg::a {
    fun calls_f() { ... pkg::m::f() ... }
}

대신 함수가 패키지에서만 표시되도록 하려면 다음과 같이 작성하세요:

module pkg::m {
    public(package) fun f() { ... }
}

module pkg::a {
    // this now works directly
    fun calls_f() { ... pkg::m::f() ... }
}

새로운 키워드

미래를 내다보며 Move 2024 베타에서는 다음 키워드가 언어에 추가됩니다: 열거형, 에 대한, 일치, mut유형. 안타깝게도 컴파일러는 이제 다른 위치에서 이러한 위치를 발견하면 구문 분석 오류를 생성합니다. 이는 언어가 성숙해짐에 따라 필요한 변경 사항입니다. 자동 마이그레이션을 수행하는 경우 마이그레이션 도구는 이러한 위치의 이름을 다음과 같이 바꿉니다. 열거형 등을 사용하여 이스케이프된 양식을 사용하도록 코드를 다시 작성합니다.

수정된 경로 및 네임스페이스

Move 2024는 레거시 Move 와 비교하여 경로 및 네임스페이스의 작동 방식을 수정합니다. 열거형 앨리어싱을 사용할 수 있습니다. 테스트 어노테이션의 다음 코드 조각을 고려해 보겠습니다. sui_system 라이브러리:

sui_시스템::sui_시스템;

...

#[expected_failure(abort_code = sui_system::validator_set::EInvalidCap)]

레거시 Move 는 항상 세 부분으로 구성된 이름을 주소로 취급합니다(sui_system), 모듈(유효성 검사기_설정), 모듈 멤버(EInvalidCap). Move 2024년에 적용되는 범위는 다음과 같습니다. 사용따라서 sui_system 속성이 모듈로 확인되어 전체적으로 이름 확인 오류가 발생합니다.

이러한 동작이 의도된 경우를 방지하기 위해 Move 2024에서는 글로벌 자격을 위한 접두사 연산이 도입되었습니다. 이를 사용하려면 이 어노테이션을 다음과 같이 다시 작성하면 됩니다:

sui_시스템::sui_시스템;

...

#[expected_failure(abort_code = ::sui_system::validator_set::EInvalidCap)]
                             // ^ 참고 `::` 여기

마이그레이션 스크립트는 가능한 경우 글로벌 정규화를 사용하여 이름 지정 오류를 수정하려고 시도합니다.

따라하기

Move 2024 베타 버전에는 여기에 설명된 획기적인 변경 사항 외에도 몇 가지 강력한 새 기능이 포함되어 있습니다. 더 많은 기능도 곧 출시될 예정입니다. 뉴스레터 구독하기 Sui 뉴스레터 에 가입하여 구문 매크로, 패턴 매칭이 포함된 열거형, 기타 사용자 정의 구문 확장 등 올해 Move 에 추가될 새롭고 흥미로운 기능에 대해 알아보세요.

피드백을 제공하거나 문제가 발생하면 다음을 통해 보고해 주세요. GitHub, Discord또는 Sui 개발자 포럼.