lua_isstring() проверява за реални низове в Lua

int lua_isstring (lua_State *L, int index);

Тази функция връща 1, ако стойността на дадения приемлив индекс е низ или число (което винаги може да се преобразува в низ), и 0 в противен случай. (Източник)

Има ли (по-елегантен) начин наистина да се докаже дали дадения низ наистина е низ, а не число в Lua? Тази функция няма абсолютно никакъв смисъл за мен!

Първата ми идея е да изследвам допълнително дължината на низа с

 `if(string.len(String) > 1) {/* this must be a string */}`

... но това не се чувства толкова добре.


person user1511417    schedule 29.09.2015    source източник
comment
На Lua ли кодирате или C (т.е. използвате Lua API)? Защо смятате, че тази функция няма смисъл? Защо мислите, че string.len(String) <= 1 може да работи?   -  person Yu Hao    schedule 29.09.2015
comment
Lua и C++. Няма смисъл, защото ще върне 1, ако отметнатият низ в Lua всъщност е = 4 или друго число. string.len(... може да помогне, защото истинският низ обикновено е по-дълъг от 1 или 2 знака.   -  person user1511417    schedule 29.09.2015
comment
if( lua_type( L, index ) == LUA_TSTRING ) .... Lua преобразува числата в низове и подобните на числа низове в числа за удобство, така че lua_isstring()lua_isnumber()) е необходимо, ако искате да направите същото във вашия собствен API.   -  person siffiejoe    schedule 29.09.2015
comment
@user1511417: string.len() няма да помогне. Истинският низ може да бъде с всякаква дължина.   -  person Keith Thompson    schedule 29.09.2015


Отговори (2)


Можете да замените

lua_isstring(L, i)

което връща true или за низ, или за число от

lua_type(L, i) == LUA_TSTRING

което дава вярно само за действителен низ.

По същия начин,

lua_isnumber(L, i)

връща true или за число, или за низ, който може да бъде преобразуван в число; ако искате по-строга проверка, можете да замените това с

lua_type(L, i) == LUA_TNUMBER

(Написал съм обвиващи функции, lua_isstring_strict() и lua_isnumber_strict().)

person Keith Thompson    schedule 29.09.2015

Тази функция няма абсолютно никакъв смисъл за мен!

Има смисъл в светлината на правилата за принуда на Lua. Всяка функция, която приема низ, трябва да приема и число, преобразувайки това число в низ. Точно така се дефинира езиковата семантика. Начинът, по който lua_isstring и lua_tostring работят, ви позволява автоматично да внедрите тази семантика във вашите C обвързвания без допълнителни усилия.

Ако не ви харесва тази семантика и искате да деактивирате автоматизираното преобразуване между низ и число, можете да дефинирате LUA_NOCVTS2N и/или LUA_NOCVTN2S във вашата компилация. По-специално, ако дефинирате LUA_NOCVTN2S, lua_isstring ще върне false за числа.

person Mud    schedule 29.09.2015
comment
Или можете да използвате lua_type() и да избегнете модифициране и повторно компилиране на самата Lua. - person Keith Thompson; 29.09.2015
comment
@Mud: Благодаря за този намек! - person user1511417; 29.09.2015
comment
@KeithThompson Вашият отговор вече покрива това. Мисълта ми е, че обикновено не трябва да проверявате за само низове в контексти, които очакват низове, защото семантиката на Lua е дефиниран да приема номер в тези контексти. Ако хоствате интерпретатора, можете да изберете да деактивирате преобразуването на типа. Ако не хоствате интерпретатора, тогава програмистите очакват да могат да разчитат на стандартната семантика на Lua и вие не трябва да нарушавате тези очаквания. Използването на isstring и tostring автоматично поддържа правилната семантика по подразбиране. - person Mud; 29.09.2015
comment
Искам да кажа, че ако не искате обичайните автоматични принуди, IMHO използването на lua_type() е по-добър подход от повторното изграждане на самата Lua, за да промените обичайната семантика на lua_isstring и lua_tostring. - person Keith Thompson; 29.09.2015
comment
@KeithThompson Вече каза това. Вие показахте как да заобиколите принудата на базата на всеки екземпляр (тривиално открито чрез разглеждане на източника; аз използвам ttisstring). Публикацията ми добавя два допълнителни бита информация: (1) като цяло това е лоша практика, защото нарушава семантиката на езика и (2) ако хоствате интерпретатора, има вграден механизъм за деактивиране принуда изцяло. - person Mud; 29.09.2015