суббота, 31 октября 2009 г.

О словоформах и наболевшем

Добрые русскоговорящие люди! Помните, что слова после числительных склоняются. Мы говорим «один час», но при этом «два часа», или «пять часов». Откуда же в интерфейсах берутся эти ужасные «4 час(а|ов)»?

Надо же всего лишь:
function FormatCount( n:uint, forms:Array ):String
{
var last2 :uint = n % 100 ;
var last1 :uint = n % 10 ;

var isTeen :Boolean = last2 > 10 && last2 < 20 ;
var isSingle:Boolean = last1 == 1 ;
var isCouple:Boolean = last1 > 1 && last1 < 5 ;

if ( !isTeen )
{
if ( isSingle ) return forms[0];
if ( isCouple ) return forms[1];
}

return forms[2];
}

И программа заговорит с пользователем на чистом русском языке!

пятница, 4 сентября 2009 г.

Тернарный оператор в Lua

Иногда при скриптинге в Lua встречается следующая конструкция:
if condition then
s = "on"
else
s = "off"
end
В большинстве языков подобная запись легко заменяется тернарным оператором:
s = condition ? "on" : "off"
Однако в Lua тернарный оператор отсутствует. Но не оставлять же такую громоздкую конструкцию?

Выход прост — к нам придут на помощь логические операторы or и and. В Lua для них выполняется следующее:
  • оператор and возвращает первое ложное значение среди сових операндов; если оба операнда истинны, возвращается последний из них
  • оператор or возвращает первое истинное значение среди своих операндов; если оба операнда ложны, возвращается последний из них
Следуя этой нехитрой логике можно записать следующую конструкцию:
s = condition and "on" or "off"
В самом деле, or имеет более низкий приоритет, и поэтому сначала выполняется контрукция с and. Если условие condition истинно, то по логике оператора and возвращается его второй аргумент ("on"). Строчка истинна, и поэтому or возвращает ее как результат всего выражения.

Если же уcловие condition ложно, то оператор and возвращает ложь, и оператор or, получив ложь в качестве первого операнда, возвращает значение второго ("off").

Таким образом, в результате махинаций с логическими операторами мы получили тернарный оператор в Lua!