Pull to refresh

Comments 20

UFO just landed and posted this here
Вы о чем конкретно? Причем здесь машина Тьюринга вообще?
UFO just landed and posted this here
Статья не об ООП, а о функциональном стиле программирования на Ruby. То, что GObject на Си реализует объектную модель, это, конечно, хорошо, но к теме данной статьи отношение имеет крайне опосредованное.
Потрясающая статья! Но думаю, если использовать do end вместо { }, то код смотрелся красивей.
Без синтаксического сахара как-то… несладко. :-)
Особо никто не машет программировать на руби как на php. Но, увы, а, для большинства, к счастью, мы живем в эпоху брутфорса.
функциональное программирование != процедурное
return [nil,"Name is required"] if String(person.(:name)) == ''

По-моему, возврат по условию выглядит совсем не в функциональном стиле.
learnyouahaskell.com/syntax-in-functions#guards-guards

bmiTell :: (RealFloat a) => a -> String  
bmiTell bmi  
    | bmi <= 18.5 = "You're underweight, you emo, you!"  
    | bmi <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"  
    | bmi <= 30.0 = "You're fat! Lose some weight, fatty!"  
    | otherwise   = "You're a whale, congratulations!" 

По-моему, очень похоже. А код на Haskell назвать написанным не в функциональном стиле язык не поворачивается.
Да, но тут полный кейс с результирующим значением. Ему больше соответствует if … elsif … else …
Так в коде на Ruby return, так что else просто не нужен. Вы же не будете писать на C так:

if (bmi <= 18.5)
    return "You're underweight, you emo, you!";
else if (bmi <= 25.0)
    return "You're supposedly normal. Pffft, I bet you're ugly!";
else if (bmi <= 30.0)
    return "You're fat! Lose some weight, fatty!";
else
    return "You're a whale, congratulations!";

Скорее вы напишете так (хотя, это далеко не лучший вариант):

if (bmi <= 18.5)
    return "You're underweight, you emo, you!";

if (bmi <= 25.0)
    return "You're supposedly normal. Pffft, I bet you're ugly!";

if (bmi <= 30.0)
    return "You're fat! Lose some weight, fatty!";

return "You're a whale, congratulations!";

else в этом случае не несет никакой смысловой нагрузки. И так ясно, что после return следующий if выполняться не будет
Скорее я напишу так:
add_person = ->(name,birthdate,gender) {
  if String(name) == '' # валидации место в отдельной функции
    [nil,"Name is required"]                  
  elsif String(birthdate) == ''
    [nil,"Birthdate is required"]             
  elsif String(gender) == ''
    [nil,"Gender is required"]                
  elsif gender != 'male' && gender != 'female'
    [nil,"Gender must be 'male' or 'female'"] 
  else
    id = insert_person.(name,birthdate,gender) # side effect
    [[name,birthdate,gender,id],nil]
  end
}


А явные return'ы пусть остаются для C, который вы зачем-то привели в пример.
Вот это как раз выглядит не в функциональном стиле, IMHO.
Если мы говорим про ruby, то к слову сказать использование String в качестве проверки на nil как минимум не корректно. Например String('') тоже вернет пустую строку. Используйте метод nil?..

В остальном интересная статья. Расширяет горизонты, особенно новичкам…
Пустая строка тоже является недопустимым аргументом, как и nil.
Sign up to leave a comment.

Articles