Почему io::format() тип не может быть iolist?

138 views
Skip to first unread message

Aleksandr Vinokurov

unread,
Aug 9, 2012, 3:46:28 AM8/9/12
to erlang-...@googlegroups.com


Доброе утро всем!

Наткнулся на то, что тип format() в io не может быть iolist-ом, и не смог понять причины такого ограничения. Кто-нибудь может объяснить мне?

С уважением,
--
Александр Винокуров
@aleksandrvin

Sergey Prochorov

unread,
Aug 9, 2012, 4:28:57 AM8/9/12
to erlang-...@googlegroups.com
format() это же строка типа "~p ~w blabla ~n" в функциях вроде io:format/2

Зачем его делать IO-листом? Эрлангу этот аргумент еще парсить чтобы подставлять значения аргументов. IO-листы предназначены в первую очередь для записи в IoDevice-ы (файлы, сокеты)

четверг, 9 августа 2012 г., 11:46:28 UTC+4 пользователь Aleksandr Vinokurov написал:

Aleksandr Vinokurov

unread,
Aug 9, 2012, 6:54:17 AM8/9/12
to erlang-...@googlegroups.com
Затем, что иногда format вызывается без параметров -- например так:

io:format("This is a foobar application!", [])

и тогда строка формата являет собой обычное сообщение, которое может быть построенно где-то в другом месте и как раз в виде iolist-а его построить будет удобнее, например так:

Title = [choose_greeting(State), username(State)],
Body = get_body(State),
Ending = choose_ending(State),
Message = [Title, "\n", Body, "\n", Ending].

в таком случае вызов io:format(Message, []) был бы кстати.

Но я похоже, что правильно с точки зрения значения параметров будет вызывать её так: io:format("~s", [Message]) -- так даже больше смысла "читается" из конструкции.

2012/8/9 Sergey Prochorov <seri...@gmail.com>

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
 
 

Valentin Nechayev

unread,
Aug 9, 2012, 7:07:03 AM8/9/12
to erlang-...@googlegroups.com
2012/8/9 Aleksandr Vinokurov <aleksa...@gmail.com>

Затем, что иногда format вызывается без параметров -- например так:

io:format("This is a foobar application!", [])

Можно список параметров не добавлять:)
 

и тогда строка формата являет собой обычное сообщение, которое может быть построенно где-то в другом месте

А вот это как раз не надо. Format должен быть константой.
Иначе можно получить много эффектов от неожиданно вылезшей реакции на тильду, если она вдруг появилась.
Эта рекомендация есть и для C-подобных языков, но там ошибка в виде printf(t) вместо printf("%s",t) может быть даже security hole. Впрочем, как и в Erlang, если удастся обрушить процесс, который этого не ожидает.

 
в таком случае вызов io:format(Message, []) был бы кстати.

Но я похоже, что правильно с точки зрения значения параметров будет вызывать её так: io:format("~s", [Message]) -- так даже больше смысла "читается" из конструкции.

Да, для сформированного программой, а не константного данного это правильный метод, в отличие от io:format(Message, []).

--
-netch-

Anton Fedorov

unread,
Aug 9, 2012, 7:08:17 AM8/9/12
to erlang-...@googlegroups.com
Даа... io:format(Message, []) -- классика создания DoS, создав username с
текстом ~w

В письме от Чтв, 09 Авг 2012, 17:54 Aleksandr Vinokurov пишет:
Regards,
Anton Fedorov
Call2ru service
E-Mail: datac...@call2ru.com
Jabber: datac...@call2ru.com
Skype: datacompboy
ICQ: 272-35-262
Mobile: +7-913-925-7974 [SMS 24h, Call 05:00-19:00 MSKT (GMT+3)]

Max Lapshin

unread,
Aug 9, 2012, 7:41:41 AM8/9/12
to erlang-...@googlegroups.com
2012/8/9 Anton Fedorov <datac...@call2ru.com>:

> Даа... io:format(Message, []) -- классика создания DoS, создав username с
> текстом ~w


Колесо сансары вечно. Думаю, что эта идея возникла ещё с
метапрограммирования перфокарт.

Dmitry Demeshchuk

unread,
Aug 9, 2012, 3:13:38 PM8/9/12
to erlang-...@googlegroups.com
Обратите взор в сторону error_logger:error_report/1 и error_logger:info_report/1.

Led

unread,
Aug 9, 2012, 4:36:36 PM8/9/12
to erlang-...@googlegroups.com

On Thursday 09 August 2012 13:54:17 Aleksandr Vinokurov wrote:
> Затем, что иногда format вызывается без параметров -- например так:
>
> io:format("This is a foobar application!", [])
>
> и тогда строка формата являет собой обычное сообщение, которое может быть
> построенно где-то в другом месте и как раз в виде iolist-а его построить
> будет удобнее, например так:
>
> Title = [choose_greeting(State), username(State)],
> Body = get_body(State),
> Ending = choose_ending(State),
> Message = [Title, "\n", Body, "\n", Ending].
>
> в таком случае вызов io:format(Message, []) был бы кстати.
>
> Но я похоже, что правильно с точки зрения значения параметров будет
> вызывать её так: io:format("~s", [Message]) -- так даже больше смысла
> "читается" из конструкции.

А put_chars/1 и put_chars/2 для кого придуманы? Только для тех, кто мануалы читает?

--
Led

JLarky

unread,
Aug 11, 2012, 1:59:09 AM8/11/12
to erlang-...@googlegroups.com

Так в utf нельзя будет написать, для этого нужно ~ts

On Aug 11, 2012 2:16 AM, "Egobrain" <xazar....@gmail.com> wrote:
А еще лучше сделать так :
io:format("~s",[Message]).

Ошибок меньше будет :)
Reply all
Reply to author
Forward
0 new messages