Почему Kernel # p печатает на стандартный вывод? - PullRequest
1 голос
/ 12 февраля 2010

Почему Kernel # p печатает на стандартном выходе? Разве printf debugging не должен выводить со стандартной ошибкой?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Вы можете определить глобальную функцию "q", которая работает так же, как "p", за исключением того, что она печатает в $ stderr.

#!/usr/bin/ruby1.8

module Kernel

  def q(*stuff)
    stuff.each { |thing| $stderr.print(thing.inspect + "\n")}
  end

end

q 'foo'    # => "foo"

Вы можете испытать желание использовать puts вместо print ... + "\n". Этот код использует print, чтобы сделать его потокобезопасным: puts может быть прервано между временем, когда он печатает свои аргументы, и временем, когда он печатает новую строку, в результате чего выходные данные из двух потоков появляются в одной строке. Редко, когда у вас есть код из нескольких потоков, одновременно записывающих в $ stdout / $ stderr, поэтому обычно это не проблема. Но так как это инструмент отладки, вы наверняка в конечном итоге будете использовать его, чтобы узнать, что происходит в потоках.

1 голос
/ 12 февраля 2010

Почему вы предполагаете, что ядро ​​# p предназначено для отладки? Он пишет в стандартный вывод точно так же, как Kernel # print или printf в C.

Если вы хотите написать стандартную ошибку, вы можете сделать:

$stderr.puts(x.inspect)

Кстати, если вы действительно хотите использовать отладку printf, советую прочитать эту статью о методах отладки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...