Есть ли эквивалент для print_r в PHP в Ruby / Rails? - PullRequest
20 голосов
/ 29 января 2009

В PHP вы можете сделать:

print_r($var) или vardump($var)

, которая печатает "читаемую человеком" информацию о переменной.

Есть ли эквивалентные функции / помощники для Ruby / Rails?

Ответы [ 8 ]

33 голосов
/ 29 января 2009

В шаблонах Rails вы можете сделать

<%= debug an_object %>

и получится хороший вывод HTML PRE.

15 голосов
/ 29 января 2009

Попробуйте использовать стр. Вам нужно будет указать это в скриптах (или в irb, если ваш .irbc этого еще не сделал):

require 'pp'

Тогда вы можете 'PrettyPrint' объект таким образом:

pp object
10 голосов
/ 29 января 2009

Вместо того, чтобы требовать 'pp' и использовать pp, вы можете просто сделать

p object

Протестированный пример

require 'pp'

class A
  def initialize
    @a = 'somevar'
    @b = [1,2,3]
    @c = {'var' => 'val'}
  end
end

a = A.new
pp a # Gives -> #<A:0x2c6d048 @a="somevar", @b=[1, 2, 3], @c={"var"=>"val"}>
p a # Gives -> #<A:0x2c6d048 @a="somevar", @b=[1, 2, 3], @c={"var"=>"val"}>. No need to require 'pp'
6 голосов
/ 29 января 2009

Есть метод inspect, который помогает. Иногда помогает вызов метода to_s для объекта (to_s возвращает строковое представление объекта). Вы также можете запросить methods, local_variables, class_variables, instance_variables, constants и global_variables.

p ['Hello',"G'day",'Bonjour','Hola'].inspect
# >> "[\"Hello\", \"G'day\", \"Bonjour\", \"Hola\"]"

p ['Hello',"G'day",'Bonjour','Hola'].to_s
# >> "HelloG'dayBonjourHola"

p Array.new.methods
# >> ["select", "[]=", "inspect", "compact"...]

monkey = 'baboon'
p local_variables
# >> ["monkey"]

class Something
  def initialize
    @x, @y = 'foo', 'bar'
    @@class_variable = 'gorilla'
  end
end

p Something.class_variables
# >> ["@@class_variable"]

s = Something.new
p s.instance_variables
# >> ["@x", "@y"]

p IO.constants
# >> ["TRUNC", "SEEK_END", "LOCK_SH"...]

p global_variables
# >> ["$-d", "$\"", "$$", "$<", "$_", "$-K"...]
5 голосов
/ 18 января 2013

Я знаю, что это старый пост, но это первое, что Google выскакивает, когда ищет "Ruby эквивалент PHP print_r". Я использую Ruby в режиме командной строки, и там действительно не очень хороший эквивалент. «pp» подходит для довольно простых структур, но как только вы начинаете вкладывать хэши в массивы в хэши в большее количество массивов, он довольно быстро превращается в беспорядок. Так как я не нашел хорошую эмуляцию print_r, я написал ее сам. Это достаточно хорошо для моих целей, не слишком сложно, и я решил поделиться этим, чтобы избавить других от головной боли. Сравните вывод с реальным PHP print_r

def print_r(inHash, *indent)
    @indent = indent.join
    if (inHash.class.to_s == "Hash") then
        print "Hash\n#{@indent}(\n"
        inHash.each { |key, value|
            if (value.class.to_s =~ /Hash/) || (value.class.to_s =~ /Array/) then
                print "#{@indent}    [#{key}] => "
                self.print_r(value, "#{@indent}        ")
            else
                puts "#{@indent}    [#{key}] => #{value}"
            end
        }
        puts "#{@indent})\n"
    elsif (inHash.class.to_s == "Array") then
        print "Array\n#{@indent}(\n"
        inHash.each_with_index { |value,index|
            if (value.class.to_s == "Hash") || (value.class.to_s == "Array") then
                print "#{@indent}    [#{index}] => "
                self.print_r(value, "#{@indent}        ")
            else
                puts "#{@indent}    [#{index}] => #{value}"
            end
        }
        puts "#{@indent})\n"
    end
    #   Pop last indent off
    8.times {@indent.chop!}
end

Вот пример (специально запутанный, чтобы показать, почему PHP print_r так хорош):

    carTools =  [ "Socket Set", "Combination Wrenches", "Oil Filter puller", "Brake Compressor" ]
    houseTools =[ "Circular Saw", "Miter Saw", "Drill" ]
    garageItems = Hash["Car1" => "Ford Mustang", "Car2" => "Honda Civic", "Bike1" => "IronHorse"]
    garageItems["Tools"] = Hash["Car Tools" => carTools, "House Tools" => houseTools]
    constructionSupplies = Hash["Plywood" => ["3/4\" T&G Plywood Sheets", "1/2\" Plywood Sheets"],
                                "Boards" => ["2x4s", "2x6s", "Engineered I-Joists"],
                                "Drywall" => ["4x8 1/2\" Sheetrock", "Mesh tape", "Paper tape", "Joint compount"]]
    carParts = Hash["Mustang" => ["Clutch", "Transmission", "3.55 Ring & Pinion Gears", "Differential", "30# Injectors", "Pro-M 77mm MAF"]]
    garageItems["Supplies"] = ["Oil", "WD40", constructionSupplies, carParts, "Brake Fluid"]
    print_r(garageItems)

Вывод print_r (на самом деле понятен человеку):

    Hash
    (
        [Car1] => Ford Mustang
        [Car2] => Honda Civic
        [Bike1] => IronHorse
        [Tools] => Hash
            (
                [Car Tools] => Array
                    (
                        [0] => Socket Set
                        [1] => Combination Wrenches
                        [2] => Oil Filter puller
                        [3] => Brake Compressor
                    )
                [House Tools] => Array
                    (
                        [0] => Circular Saw
                        [1] => Miter Saw
                        [2] => Drill
                    )
            )
        [Supplies] => Array
            (
                [0] => Oil
                [1] => WD40
                [2] => Hash
                    (
                        [Plywood] => Array
                            (
                                [0] => 3/4" T&G Plywood Sheets
                                [1] => 1/2" Plywood Sheets
                            )
                        [Boards] => Array
                            (
                                [0] => 2x4s
                                [1] => 2x6s
                                [2] => Engineered I-Joists
                            )
                        [Drywall] => Array
                            (
                                [0] => 4x8 1/2" Sheetrock
                                [1] => Mesh tape
                                [2] => Paper tape
                                [3] => Joint compount
                            )
                    )
                [3] => Hash
                    (
                        [Mustang] => Array
                            (
                                [0] => Clutch
                                [1] => Transmission
                                [2] => 3.55 Ring & Pinion Gears
                                [3] => Differential
                                [4] => 30# Injectors
                                [5] => Pro-M 77mm MAF
                            )
                    )
                [4] => Brake Fluid
            )
    )
2 голосов
/ 30 января 2009

Ознакомьтесь с руководством по отладке рельсов: http://guides.rubyonrails.com/debugging_rails_applications.html

Рекомендации: Скрипт / консоль отлично подходит, чтобы попробовать что-то в контексте вашего приложения. script / server --debugger для запуска сервера с включенным отладчиком, затем вы можете использовать «debug» в своем коде, чтобы разбить интерактивную оболочку

1 голос
/ 04 сентября 2009

Один подход, на который я опираюсь, заключается в следующем:

logger.debug "OBJECT: #{an_object.to_yaml}"

Легко читается, хотя может быть немного громоздким для крупных объектов.

0 голосов
/ 04 сентября 2009

Думаю, я немного опоздал, но как насчет logger.info [debug | warning]? Используйте это из контроллеров и моделей. Он будет отображаться в ваших лог-файлах (development.log в режиме разработки); и вышеупомянутые <%= debug("str: " + str) %> для просмотров.

Это не точные ответы на ваши вопросы, но вы также можете использовать скрипт / консоль, чтобы загрузить приложение rails в интерактивную сессию.

Наконец, вы можете поместить отладчик в строку вашего приложения rails, и браузер «зависнет», когда ваше приложение выполнит эту строку, и вы сможете находиться в сеансе отладки с той строки, в которую вы поместили отладчик исходный код.

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