openlang

함수의 void 결과를 변수에 넣어도 되나요?

이게 어떻게 통과하나요?

const std = @import("std");

pub fn main() !void {
    const outcome =
        std.debug.print("Hello, world\n", .{});
    _ = outcome;
}

std.debug.print()의 결과는 void인데, 그 결과를 outcome에 넣어도 Zig는 아무 말도 하지 않네요.

프로젝트를 하다가 외부 라이브러리의 API가 값을 반환한다고 착각해서 이 문제를 만났어요. 결국 {s}로 그 결과를 문자열에 포맷하려니 컴파일러 오류가 났지만, 처음의 잘못된 가정까지 거슬러 올라가는 데 시간이 걸렸어요.

void를 변수에 저장하는 게 유용한 경우도 있나요?

영어에서 번역원문 보기

이어지는 대화 4

서로의 근거를 따라
  1. 고유 링크

    값이 존재할지 자체를 comptime에 정하는 코드를 더 단순하게 해 줍니다.

    함수 타입을 분석하며 여러 겹의 오류 유니온을 따라가는 것보다, 결과를 담은 변수의 타입을 확인하는 편이 훨씬 쉽고 여기서 유용합니다.

    다른 작업도 하는 함수라면 어차피 호출해야 할 수도 있고요.

    그 밖에는 쓸모없는 값을 허용한다고 크게 해로울 건 없습니다.

    영어에서 번역원문 보기
  2. 고유 링크

    어떤 항목을 언제 test 블록 안에서 “버려야” 하는지 궁금합니다. 예를 들어 std.zig 모듈 소스 끝에는 이런 코드가 있어요:

    test {
        _ = Ast;
        _ = AstRlAnnotate;
        _ = BuiltinFn;
        _ = Client;
        _ = ErrorBundle;
        _ = LibCDirs;
        _ = LibCInstallation;
        _ = Server;
        _ = TokenSmith;
        _ = WindowsSdk;
        _ = number_literal;
        _ = primitives;
        _ = string_literal;
        _ = system;
        _ = target;
        _ = c_translation;
        _ = llvm;
        _ = @import("zig/parser_fuzz.zig");
    }

    라이브러리라면 가져온 모듈을 전부 저기에 넣어야 하나요? 아니라면 어떤 모듈에 이 처리가 필요한가요?

    영어에서 번역원문 보기
  3. 고유 링크

    라이브러리라면 가져온 모듈을 전부 저기에 넣어야 하나요? 아니라면 어떤 모듈에 이 처리가 필요한가요?

    루트 파일의 테스트만 암묵적으로 실행되므로, 다른 파일/모듈/네임스페이스는 테스트를 담은 네임스페이스를 참조해야 합니다. 루트 파일 안에서도 테스트를 담은 struct/union/enum에는 마찬가지로 각각 참조가 필요합니다.

    분명히 하자면, sample.member는 sample.member만 참조하고 sample는 참조하지 않지만, _ = sample는 sample 자체를 참조합니다.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 다른 클래스 안에 있는 클래스를 상속하려면 어떻게 하나요?

    안녕하세요, 제가 코드를 바꿀 수 없는 패키지에 다음과 같은 클래스 계층이 있어요: 편하게 쓰려고 Inner를 감싸는 래퍼를 추가하려는데, Inner가 바깥 인스턴스에 의존해서 지금까지는 바깥 클래스의 서브클래스 안에 넣는…

    답글 1최근 활동 scala
  2. Lean4의 have 바인딩과 let 바인딩 비교

    아래 두 표현식을 보니 그리고 똑같이 동작하더군요. 정리를 증명할 때도 마찬가지예요. 서로 바꿔 써도 되나요? 차이가 뭔가요?

    답글 3최근 활동 lean-4
  3. 문자열 배열을 값으로 갖는 TypeScript Map 초기화

    각 항목이 문자열 배열을 담는 Map을 만들고 있어요. 타입 선언과 초기화를 한 문장으로 같이 하려면 어떻게 하나요? 제 (단순한) 시도는 이랬어요: 그랬더니 이렇게 나와요:

    답글 2최근 활동 typescript