2015-09-29 4 views
4
int lua_isstring (lua_State *L, int index); 

Эта функция возвращает 1, если значение в заданном приемлемом индексе строка или число (которое всегда конвертируются в строку), и 0 иначе , (Source)lua_isstring() проверить для реальных строк в Lua

Есть (более элегантный) способ действительно доказательство, если данная строка действительно является строкой и не числа в Lua? Эта функция не имеет для меня никакого смысла!

Моя первая идея состоит в том, чтобы дополнительно изучить строку длины с

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

... но это не чувствовать себя так хорошо.

+0

Вы кодируете в Lua или C (например, используя Lua API)? Почему, по-вашему, эти функции не имеют никакого смысла? Как вы думаете, почему 'string.len (String) <= 1' может работать? –

+0

Lua и C++. Это не имеет смысла, потому что он вернет 1, если проверенная строка в Lua фактически равна 4 или любому другому номеру. 'string.len (...' может помочь, потому что реальная строка обычно длиннее 1 или 2 символов. – user1511417

+1

'if (lua_type (L, index) == LUA_TSTRING) ...'. Lua преобразует числа в строки и числовые строки для чисел для удобства, поэтому 'lua_isstring()' (и 'lua_isnumber()') необходимо, если вы хотите сделать то же самое в своем собственном API. – siffiejoe

ответ

3

Вы можете заменить

lua_isstring(L, i) 

, который возвращает истину, либо для строки или числа по

lua_type(L, i) == LUA_TSTRING 

, который дает верно только для фактической строки.

Аналогично,

lua_isnumber(L, i) 

возвращает истину либо для ряда или для строки, который может быть преобразован в ряд; если вы хотите более строгую проверку, вы можете заменить это

lua_type(L, i) == LUA_TNUMBER 

(я писал функции обертки, lua_isstring_strict() и lua_isnumber_strict().)

2

Эта функция не имеет абсолютно никакого смысла для меня!

Это имеет смысл в свете coercion rules Lua. Любая функция, принимающая строку, также должна принимать число, преобразовывая это число в строку. Именно так определяется семантика языка. Способ lua_isstring и lua_tostring позволяет вам автоматически реализовать эти семантики в ваших привязках C без каких-либо дополнительных усилий.

Если вам не нравятся эти семантики и вы хотите отключить преобразование автоматизации между строкой и номером, вы можете определить LUA_NOCVTS2N и/или LUA_NOCVTN2S в своей сборке. В частности, если вы определяете LUA_NOCVTN2S, lua_isstring вернет false для чисел.

+0

Или вы можете использовать 'lua_type()' и избегать модификации и перекомпиляции Lua. –

+0

@Mud: Спасибо за этот намек! – user1511417

+0

@KeithThompson Ваш ответ уже охватывает это. Я хочу сказать, что вы обычно должны * не * проверять строки * только * в контекстах, которые ожидают строки, потому что семантика Lua [определена для принятия числа в этих контекстах] (http://www.lua.org/manual/ 5,3/manual.html # 3.4.3). Если вы используете интерпретатор, вы можете отключить преобразование типов. Если вы не пользуетесь интерпретатором, тогда программисты ожидают, что смогут полагаться на стандартную семантику Lua, и вы не должны нарушать эти ожидания. Использование 'isstring' и' tostring' автоматически поддерживает правильную семантику по умолчанию. – Mud