LINUX.ORG.RU

Ruby: выполнение невыполнимого условия?


0

0

NetBeans 6.5, отладка, n_col имеет значение 0. доходит до условия:

if (n_col == 3)
И переходит к блоку кода внутри условия! Что я делаю не так?

Весь метод:

class GismeteoParser < WeatherParser
  def parse
      weather = $& if @html =~ /<tbody(\s|.)*?<\/tbody>/
      n_row = 0
      cloud, date, hour = 0, 0, 0
      weather.scan(/<tr(\s|.)*?<\/tr>/) do
        row = $&
        n_col = 0
        row.scan(/<td(\s|.)*?<\/td>/) do
          col = $&
          #date = col.scan(/>\d+</).scan(/\d+/) if n_col == 0
          if (n_col == 3)
            img_name = $& if col =~ /\/\w+\.png/ else img_name = ""
            img_name.sub!(/w+/) do |png|
              case png
              when "dull" then "100"
              when "cloud" then "75"
              when "suncl" then "50"
              when "sunc" then "25"
              when "sun" then "0"
              end
            end
            cloud = s.to_i unless s = img_name.scan(/\d+/)
            next
          end
          n_col += 1
        end
        @cloudness.push("#{date}.#{@month}.2010 #{hour}:00;#{cloud}")
        n_row += 1
      end
  end
end

>Что я делаю не так?

парсишь нерегулярную грамматику просто регулярными выражениями, которые ещё, небось, и жадные по умолчанию.

dimon555 ★★★★★
()

Я не понимаю, а что еще ты хотел от блока, который работает только с n_col == 3? Может отладчик нетбинс слишком умный и пропускает первые две итерации..

volh ★★
()
Ответ на: комментарий от volh

В Watch-ах написано, что n_col имеет значение 0, а (n_col == 3) имеет значение false. Точка останова сразу после условия.

DrLivesey
() автор топика
Ответ на: комментарий от Deleted

Возможно ты хотел

img_name = if col =~ /\/\w+\.png/
    $&
else
    ''
end

или что-то в таком духе.

Deleted
()
Ответ на: комментарий от DrLivesey

>Безуспешная попытка изпользовать полную форму условия в Ruby-style.

Ты питоновскую конструкцию вообще-то написал, и то неправильно.

Надо было img_name = if col =~ /\/\w+\.png/ then $& else «» end

anonymous
()
Ответ на: комментарий от anonymous

но все это условие все равно зазря, дублируешь и так существующее поведение. можно было просто сделать img_name = /\/\w+\.png/.match(col).to_s

anonymous
()
Ответ на: комментарий от DrLivesey

Безуспешная попытка изпользовать полную форму условия в Ruby-style.

Жаль тебя огорчать, но как раз это была успешная попытка использовать полную форму if-else выражения. Твой код просто не правильно отформатирован, он должен выглядеть вот так:

        row.scan(/<td(\s|.)*?<\/td>/) do 
          col = $& 
          #date = col.scan(/>\d+</).scan(/\d+/) if n_col == 0 
          if (n_col == 3) 
            img_name = $& if col =~ /\/\w+\.png/ 
          else img_name = "" 
          img_name.sub!(/w+/) do |png| 
            case png 
            when "dull" then "100" 
            when "cloud" then "75" 
            when "suncl" then "50" 
            when "sunc" then "25" 
            when "sun" then "0" 
            end 
          end 
          cloud = s.to_i unless s = img_name.scan(/\d+/) 
          next 
        end 

И да, два пробела на отступ для руби - это ппц. Переходи хотя бы на четыре.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Как страшно жить, зная что где-то пишут такое.

balodja ★★★
()
Ответ на: комментарий от KRoN73

>Вот поэтому я уже много лет предпочитаю print-отладку :)

Я предпочитаю подключаться к живому процессу и запускать там REPL. ruby-debug и gdb.rb у меня далеко не всегда работают, поэтому сделал что-то вроде лиспового swank, который биндит repl на определенный порт. Удобно ажжуть. Еще бы руби мог собственно код объектов возвращать.. :/

volh ★★
()
Ответ на: комментарий от LamerOk

>И да, два пробела на отступ для руби - это ппц. Переходи хотя бы на четыре.

Ну вот как раз два пробела - это дефолт. Недавно задумался, а почему не четыре. Ни одного проекта не нашел, который бы четыре использовал, два или в редких случаях восемь. Может набросаешь ссылок?

volh ★★
()
Ответ на: комментарий от dmitry_vk

Так ведь это только для прогноза, насколько я понял. А мне архив (который они называют «дневник») содрать надо.

DrLivesey
() автор топика
Ответ на: комментарий от volh

> Ну вот как раз два пробела - это дефолт.

Вот из-за этого «дефолта» я как раз не правильно табуляцию расставил. ))

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk
if (n_col == 3)  
  img_name = $& if col =~ /\/\w+\.png/  
else img_name = ""

а я бы написал это так, имхо короче и понятнее:

img_name = "" 
img_name = $& if n_col == 3 && col =~ /\/\w+\.png/
www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> а я бы написал это так

Тут фокус не в том, как это написать, а в том, что чувак не понял, к какому if'у относится это else. ))

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.