Vulkan: vk*CreateInfo structs에서 sType의 요점은 무엇입니까?
모든 create infostructs에서 (a ) Vulkan API 에는가 for...of회원. 가 한 수 왜 ?가치가 한 가지 일 수밖에 없는데 왜 이것이 있습니까? 명확하여다 할 수 .
대응되는 매개변수로서의 구조물
기능. 좀 것 요.좀 중복되는 것 같습니다.드라이버가 이 구조를 GPU로 바로 전달하는 경우 이 구조를 가져야 할 수도 있음을 알 수 있습니다(항상 첫 번째 멤버라는 것을 알고 있었습니다).그러나 드라이버가 실행하면 오류가 발생하지 않고 구조에 int를 추가하는 것이 매우 계산적으로 비효율적인 작업으로 보이지 않기 때문에 앱에서 실행하는 것은 매우 좋지 않은 아이디어로 보입니다.왜 존재하는 건지 모르겠어요for ... ofTL;DR
왜?
function isIterable(obj) {
// checks for null and undefined
if (obj == null) {
return false;
}
return typeof obj[Symbol.iterator] === 'function';
}
구조물은.
멤버?
그들은 그것을 가지고 있기 때문에.true현장은 실제로 작동합니다.objC 그 를 들어, API 는 C 합니다입니다.그러나 최근에는 특히 많은 그러한 구조들이 구현에 추가적인 정보를 제공하는 구조들의 연결된 목록들을 가지고 있습니다.이러한 1는 조칸 1.1/2이지만)다를 다른 .
if (Symbol.iterator in Object(value)) {
}
들판.null은 합니다를 는 매우 중요합니다.undefined포인터...어느것이true 있지 종류가 정해져 있지 않습니다.이 NULL이 이
if (value?.[Symbol.iterator]) {
}
.field;을 알 수 .?. 기본 API .null필드, 그 유형은 API 자체의 일부이기 때문입니다.하지만 그렇게 해야 하는 데에는 가정적인 이유가 있습니다. (불칸 릴리스에서는 아직 완료되지 않았습니다.)undefined이후 버전의 Vulkan은 예를 들어 명령 버퍼 풀을 생성할 때 확장될 수 있습니다.하지만 어떻게 그럴 수 있을까요?은 완전히 다를 할 수
이 는 . 입니다와 한 서명을 입니다.isIterable(x)기능.
Keep in mind that the word iterable specifically refers to the iterable protocol, though there exist different ways to loop over objects. The following list is not exhaustive:
arr.forEach(func)runs a function on each non-empty slot in an array (see sparse arrays here).- 다음을 사용하여 개체의 특정 키를 열거할 수 있습니다.
for ... in - Some collections have
.keys(),.values()and.entries()methods that return iterators. Object.keys(obj),Object.values(obj)orObject.entries(obj)return arrays made from an object's properties, which you can then iterate on.
왜 이렇게 장황해요?
const isIterable = object =>
object != null && typeof object[Symbol.iterator] === 'function'
2022년 답변
" ""foo"Itable"이라는 질문에 단 하나의 답이 있는 언어(PHP, Python)에서 온 것일 수 있습니다.현대의 자바스크립트에는 다양한 종류가 있습니다.따라서 변수를 사용하여 수행하고자 하는 작업에 따라 반복하는 능력을 확인해야 합니다.
TL;DR
- 를 사용하여 반복할 수 있는 능력을 테스트합니다.
forEach()와 함께!!foo.forEach에서 true 를합니다. - 를 사용하여 반복할 수 있는 능력을 테스트합니다.
for..of와 함께!!foo[Symbol.iterator]true 를합니다를 에서합니다. - 를 사용하여 반복할 수 있는 능력을 테스트합니다.
for..in와 함께!!Object.keys(Object(foo)).length, 에서 true 를합니다를 에서합니다.
장답
몇 가지 변수를 정의해 보겠습니다.
const someNumber = 42;
42
const someArray = [1,2,3];
(3) [1, 2, 3]
const someString = "Hello";
"Hello, world!"
const someObject = {a:"A", b:"B"};
{a: "A", b: "B"}
에서의 반복성 forEach()
로 할 수 있는 입니까?forEach(), 로을 하여 테스트했습니다.!!foo.forEach:
someNumber.forEach(x=>console.log(x));
VM1526:1 Uncaught TypeError: someNumber.forEach is not a function at <anonymous>:1:12
someArray.forEach(x=>console.log(x));
VM916:1 1
VM916:1 2
VM916:1 3
undefined
someString.forEach(x=>console.log(x));
VM957:1 Uncaught TypeError: someString.forEach is not a function at <anonymous>:1:12
someObject.forEach(x=>console.log(x));
VM994:1 Uncaught TypeError: someObject.forEach is not a function at <anonymous>:1:12
배열만 사용할 수 있는 것 같습니다.forEach().
에서의 반복성 for..of
로 할 수 있는 입니까?for..of, 로을 하여 테스트했습니다.!!foo[Symbol.iterator]:
for (x of someNumber) { console.log(x); }
VM21027:1 Uncaught TypeError: someNumber is not iterable at <anonymous>:1:11
for (x of someArray) { console.log(x); }
VM21047:1 1
VM21047:1 2
VM21047:1 3
undefined
for (x of someString) { console.log(x); }
VM21065:1 H
VM21065:1 e
VM21065:1 l
VM21065:1 l
VM21065:1 o
undefined
for (x of someObject) { console.log(x); }
VM21085:1 Uncaught TypeError: someObject is not iterable at <anonymous>:1:11
배열 및 문자열은 for..of로 반복 가능한 것처럼 보이지만 개체는 그렇지 않습니다.그리고 Number와 Object 모두 오류를 던졌습니다.
에서의 반복성 for..in
로 할 수 있는 입니까?for..in, 로을 하여 테스트했습니다.!!Object.keys(Object(foo)).length:
for (x in someNumber) { console.log(x); }
undefined
for (x in someArray) { console.log(x); }
VM20918:1 0
VM20918:1 1
VM20918:1 2
undefined
for (x in someString) { console.log(x); }
VM20945:1 0
VM20945:1 1
VM20945:1 2
VM20945:1 3
VM20945:1 4
undefined
for (x in someObject) { console.log(x); }
VM20972:1 a
VM20972:1 b
undefined
배열, 문자열 및 개체는 모두 다음과 같이 나타낼 수 있습니다.for..in 그것이 를 던지지 그리고 그것이 반복되지는 않았지만 Number는 오류를 던지지 않았습니다.
ES6 를 .forEachn보다 훨씬 더됩니다.for..in아니면for..of은 세 에 대해 그러나 자바스크립트 개발자들은 세 가지 접근법의 차이점과 각 접근법의 다른 행동에 대해 알고 있어야 합니다.
참고로, 사용 가능한 정의에 주의해야 합니다.다른 언어에서 온 사람이라면, 예를 들어, 당신이 반복할 수 있는 어떤 것을 기대할 것입니다.for루프는 반복 가능합니다.유감스럽게도 반복 프로토콜을 구현하는 것을 의미하는 able은 여기서 해당되지 않습니다.
명확하게 하기 예들은 를 반환합니다.false{a: 1, b: 2}해당 개체는 반복 프로토콜을 구현하지 않기 때문입니다.수 입니다.for...of 하지만 당신은 여전히 할 수 있습니다.for...in.
따라서 고통스러운 실수를 피하고 싶다면 아래와 같이 메소드 이름을 변경하여 코드를 보다 구체적으로 지정합니다.
/**
* @param variable
* @returns {boolean}
*/
const hasIterationProtocol = variable =>
variable !== null && Symbol.iterator in Object(variable);
비동기화자의 경우 'Symbol.interator' 대신 'Symbol.asyncIterator'를 확인해야 합니다.
async function* doSomething(i) {
yield 1;
yield 2;
}
let obj = doSomething();
console.log(typeof obj[Symbol.iterator] === 'function'); // false
console.log(typeof obj[Symbol.asyncIterator] === 'function'); // true
:Symbol.iterator그렇다면 그것은 참을 만합니다.그러면 우리는 단순히 확인할 수 있습니다.obj?
타이프스크립트
function isIterable(x: unknown): boolean {
return !!x?.[Symbol.iterator];
}
또는 화살표 함수로
const isIterable = (x: unknown): boolean => !!x?.[Symbol.iterator];
자바스크립트
const isIterable = x => !!x?.[Symbol.iterator];
예
isIterable(["hello", "world"]); // true
isIterable({}); // false
isIterable(null); // false
isIterable(undefined); // false
isIterable(1); // false
isIterable(true); // false
isIterable(Symbol("foo")); // false
isIterable(new Set()); // true
isIterable(new Map()); // true
오늘날, 이미 진술된 바와 같이, 다음을 시험하기 위해obj만 해도 요?
obj != null && typeof obj[Symbol.iterator] === 'function'
과거 답변(더 이상 유효하지 않음)
이 컨스트럭트는 ECMASScript 6판 언어 사양 초안의 일부입니다.그래서 최종 버전 이전에 바뀔 수도 있습니다.
이 초안에서 사용 가능한 개체에는 다음 함수가 있어야 합니다.iterator
다음과 같이 개체가 실행 가능한지 확인할 수 있습니다.
function isIterable(obj){
if(obj === undefined || obj === null){
return false;
}
return obj.iterator !== undefined;
}
(({key: value} 또는()[value, value]), 다음을 수행할 수 있습니다.
const isArray = function (a) {
return Array.isArray(a);
};
const isObject = function (o) {
return o === Object(o) && !isArray(o) && typeof o !== 'function';
};
function isIterable(variable) {
return isArray(variable) || isObject(variable);
}
저는 당신을 위해 수표를 찾고 있었습니다.for ... in그리고 다음을 결정했습니다.
isIterable (value) {
// add further checks here based on need.
return Object.keys(Object(value)).length > 0
}
이것은 돌아올 것입니다.true적어도 하나 이상의 가치가 있는 모든 것에 대해. 빈 빈 빈 열,열,됩니다를 합니다.false.그렇지만{a: 'x', b:'y'}돌아올 것입니다true.
언급URL : https://stackoverflow.com/questions/18884249/checking-whether-something-is-iterable
'programing' 카테고리의 다른 글
| 각진 안전하지 않은 링크 (0) | 2023.10.06 |
|---|---|
| Oracle PL/SQL의 테이블 변수? (0) | 2023.10.01 |
| Vulkan: What is the point of sType in vk*CreateInfo structs? (0) | 2023.10.01 |
| 입력 시 ng-click 동작 방지 (0) | 2023.10.01 |
| 공유 정적 라이브러리를 사용하는 xcode에서 "중복 기호" 오류를 방지하려면 어떻게 해야 합니까? (0) | 2023.10.01 |