루비를 사용하면이 작업을 수행 할 수 있습니다.Dlang에서 여러 변수를 동시에 할당 할 수있는 방법이 있습니까?
s = "split by space"
A,B,C = s.split(" ").map(&:to_i)
D-lang을 사용하면 컴파일 오류가 발생합니다.
string s = "split by space";
int A,B,C = s.split(" ").map!(x => x.to!int);
루비를 사용하면이 작업을 수행 할 수 있습니다.Dlang에서 여러 변수를 동시에 할당 할 수있는 방법이 있습니까?
s = "split by space"
A,B,C = s.split(" ").map(&:to_i)
D-lang을 사용하면 컴파일 오류가 발생합니다.
string s = "split by space";
int A,B,C = s.split(" ").map!(x => x.to!int);
조나단은 대부분 권리이지만, 루비보다 더 자세한이기는하지만, 그 구성 부분으로 tuple
을 분할하는 방법이 실제로 존재하고, 어떤 편리한 형식 유추하지 않고 :
import std.traits : AliasSeq;
import std.typecons : tuple;
auto foo() { return tuple(42, 29, "hello"); }
unittest {
int a, b;
string c;
AliasSeq!(a, b, c) = foo(); // Look ma, magic!
assert(a == 42);
assert(b == 29);
assert(c == "hello");
}
더 내장 없지만 예제와 같은 범위로이를 수행하는 방법으로 라이브러리에 구현할 수 있습니다.
import std.traits : AliasSeq;
import std.meta : Repeat;
import std.typecons : Tuple, tuple;
import std.algorithm : map;
import std.conv : to;
import std.string : split;
import std.range : isInputRange, ElementType;
unittest {
string s = "1 2 3";
int A,B,C;
AliasSeq!(A,B,C) = s.split(" ").map!(x => x.to!int).tuplify!3;
assert(A == 1);
assert(B == 2);
assert(C == 3);
}
auto tuplify(size_t n, R)(R r) if (isInputRange!R) {
Tuple!(Repeat!(n, ElementType!R)) result;
static foreach (i; 0..n) {
result[i] = r.front;
r.popFront();
}
assert(r.empty);
return result;
}
아니요, 그렇게 할 방법이 없습니다. 이야기 오프와 온 아마도 언어 튜플 지원을 추가하는 방법에 대한 있도록이 있었다 그럴 수 언젠가는 일이 있지만, 지금은 가능하지 않습니다
int a;
int b;
string c;
(a, b, c) = foo();
어쩌면 같은. 그래서 std.typecons.Tuple/tuple 같은 가장 가까운 사용하는 것입니다 뭔가 당신은
Tuple!(int, int, string) foo() { return tuple(42, 29, "hello"); }
Tuple!(int, int, string) result = foo();
또는
auto foo() { return tuple(42, 29, "hello"); }
auto result = foo();
하지만 Tuple
은 궁극적 가능성 단지 구조체처럼 뭔가를 할 수 있고, 당신은 마술을 분할 할 수없는 다른 끝에서. result[0]
또는 result[1]
과 같은 색인을 통해 구성원에 액세스하거나 Tuple
에 이름 (예 : Tuple!(int, "x", int, "y", string, "str")
- 회원 이름에 액세스 할 수 있습니다 (예 : result.x
. 따라서 Tuple
/tuple
을 사용하면 구조체 유형을 명시 적으로 선언하지 않고도 여러 값을 반환 할 수 있지만 구조체 유형은 계속 생성되지만 반환 값을 쉽게 묶을 수는 있지만 허용하지는 않습니다. 다른 쪽 끝에 자동으로 포장을 풉니 다. 컴파일러 지원이 필요하지 않을 수도 있습니다.
그러나, 우리는 언어에 더 나은 튜플 지원을했다하더라도 뭔가 같은
(a, b, c) = foo();
근무 있도록, 당신이 map
때문에 일하는 것이 일을하려고하는지 구체적으로 범위를 반환 의심한다. 따라서 멤버 함수가있는 객체입니다. 어떤 종류의 튜플이 분리되지 않습니다. 올바른 함수 호출 집합으로 추출 할 수있는 값 목록을 나타낼뿐입니다. 그리고 그 값의 수는 컴파일 타임에 알려지지 않습니다. 따라서 컴파일러가 범위 프리미티브를 충분히 이해한다고 가정하더라도 컴파일 타임에 컴파일러가이를 보장 할 수는 없습니다 할당하려는 변수에 넣을 값은 충분합니다. 그 수만큼의 값이 있음은 물론입니다. 따라서 작업과 같은 것을 만드는 것이 불가능하지는 않지만 (예 : 범위에 값이 충분하지 않은 경우 컴파일 시간에 Error
을 던진 경우), 구현 된 경우 놀랄 것입니다. D는 정적으로 형식이 지정된 언어이므로 동적 인 부분을 효과적으로 만들 수 있기 때문에 언어에있어서 문자 그대로의 특성을 벗어날 수 있습니다. 루비는 역동적 인 언어이므로 매우 다른 짐승입니다.
튜플을 개선하면 언어가 개선 될 것이므로 DIP process을 거치고 승인을 받아야합니다. 아무런 문제가 발생하지 않았습니다.
고마워요 조나단! 나는 조금 어려워 느꼈다 ... – hiropon
Splendid! 그것은 dmd 2.076에서 잘 작동합니다. D-lang에 이런 종류의 기능이 있다면 경쟁 프로그래머가 행복 할 것입니다. 아무튼 감사 해요. – hiropon