#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. что ж, я все понял. Проблема была связана с неверными входными данными, поэтому проверка так и не была запущена. Спасибо за ваше время и усилия!