Ruby — доступ к объекту внутри цикла

#ruby

#ruby

Вопрос:

У меня небольшая проблема с этим кодом Ruby:

 class Tap
attr_accessor :c, :v, :n, :tname

def initialize(n, c, v)
    @c = c.to_i
    @v = v.to_f
    @n = n.to_i
    @tname = sprintf("T-%dd DS", @n, @c)
end
end

#...

taps = Array.new
File.open("taps.txt").each { |line|     
    n, c, v = line.split("t") 
    tap = Tap.new(n, c, v)
    taps.push tap
}

besttap = Tap.new(100,100,100) # Here I try to create a global varialble
2.upto(floors) { |f|

    l  = cable_loss * floor_height
    out << "some text to output"

    bestuserlevel = 10
    besttap = Tap.new(100,100,100)
    taps.each { |tap|
        l_in_tmp = tap.v   l
        userlevel = l_in_tmp - tap.c
        if userlevel.abs < bestuserlevel.abs
            besttap = tap
            bestuserlevel = userlevel
        end
        puts tap.inspect
    }

    l  = besttap.v #WELL, I CANNOT ACCESS besttap here. I get that one created with Tap.new(100,100,100), but I need one chosen by the cycle before (it should be something Tap.new(2, 8,0.5) - i.e - best suitable value from taps array )... 


    out << "some text to output"

}
 

taps это массив, состоящий из хэшей.

По какой-то причине, после выбора правильного крана, я могу получить правильное bestuserlevel значение, но нет besttap (я полагаю, что там есть определенный хэш …)

Может кто-нибудь, пожалуйста, помочь мне разобраться в этом?

Комментарии:

1. Какова цель этого кода?

2. для вычисления простой кабельной сети… Уровни сигнала и т. Д

3. Если вы не хотите объяснять дальше, я не могу помочь вам написать код, который это делает. Ваш код, честно говоря, беспорядок; вы не следуете соглашениям, идиомам или рекомендациям. Например, именование переменных скрывает такие вещи, как l_in_tmp создание хэша с Hash.new помощью вместо {} и создание временных переменных вместо использования собственных reduce или создания многострочных блоков со скобками вместо do...end .

4. пожалуйста, ознакомьтесь с новым вариантом. C и V — это параматериалы tap, эти имена являются стандартными.

5. C и V могут быть стандартными, но я очень сомневаюсь, что «l» и «l_in_tmp» являются.

Ответ №1:

Этот код отлично работает, когда я его запускаю. Хотя я предполагаю, что здесь » l» — это » 1″. Возможно, это ваша проблема?

Кроме этой опечатки, похоже, это работает правильно, поэтому я предполагаю, что проблема где-то в вашем хэше taps — если вы установите статический хэш со значениями в качестве теста, он все равно сломается?

Я должен добавить, что besttap, очевидно, будет пустым в любой ситуации, когда besttap.replace не запускается, так что я бы посмотрел именно на это — может быть, ваш входной хэш не имеет никаких значений, которые вызывают замену?

(В этом случае bestuserlevel все равно будет иметь значение)

Комментарии:

1. нет. маленькая буква l — это имя переменной.. Я отредактирую код через минуту. пожалуйста, ознакомьтесь с новыми изменениями

2. И именно поэтому вы не должны исправлять такой тупой код и абсурдные имена переменных. Но да, это работает для меня — ваша проблема заключается в чем-то за пределами кода, который вы опубликовали.

3. Я не вижу ничего плохого в логике как таковой, интересно, те ли это данные, которые вы используете. Попробуйте ввести некоторые значения внутри блока условий и посмотреть, правильно ли записано значение.

4. Да, убедитесь, что отводы действительно назначаются правильно — дайте нам значение отводов перед входом в цикл в этом примере.

5. что ж, я все понял. Проблема была связана с неверными входными данными, поэтому проверка так и не была запущена. Спасибо за ваше время и усилия!