Получил простую функцию индикатора выполнения, которую я написал на днях:
#!/bin/bash
# 1. Create ProgressBar function
# 1.1 Input is currentState($1) and totalState($2)
function ProgressBar {
# Process data
let _progress=(${1}*100/${2}*100)/100
let _done=(${_progress}*4)/10
let _left=40- Получил простую функцию индикатора выполнения, которую я написал на днях:
[110] Или поймал ее,
https://github.com/fearside/ProgressBar /
done
# Build progressbar string lengths
_fill=$(printf "%${_done}s")
_empty=$(printf "%${_left}s")
# 1.2 Build progressbar strings and print the ProgressBar line
# 1.2.1 Output example:
# 1.2.1.1 Progress : [########################################] 100%
printf "\rProgress : [${_fill// /\#}${_empty// /-}] ${_progress}%%"
}
# Variables
_start=1
# This accounts as the "totalState" variable for the ProgressBar function
_end=100
# Proof of concept
for number in $(seq ${_start} ${_end})
do
sleep 0.1
ProgressBar ${number} ${_end}
done
printf '\nFinished!\n'
Или поймал ее,
https://github.com/fearside/ProgressBar /
Я думаю, что это действительно вопрос о моделировании предметной области.
Нет ничего плохого в том, что вы делаете, если вы хотите расширить / улучшить способ поведения потока - ибо пример для добавления вывода отладки или производительности, но я не думаю, что это то, что вам нужно.
Возможно, вы захотите смоделировать какую-то концепцию в своей области с активными объектами. В этом случае лучше использовать стандартный подход Ruby, потому что он позволяет достичь этого без изменения модели предметной области.
Наследование действительно следует использовать только для моделирования отношений IS_A. Стандартный рубиновый код для этого аккуратно завершает решение.
Чтобы сделать ваш объект активным, попросите его захватить вновь созданный поток каким-либо методом
Class MyClass
...
def run
while work_to_be_done do
some_work
end
end
...
end
threads = []
# start creating active objects by creating an object and assigning
# a thread to each
threads << Thread.new { MyClass.new.run }
threads << Thread.new { MyOtherClass.new.run }
... do more stuff
# now we're done just wait for all objects to finish ....
threads.each { |t| t.join }
# ok, everyone is done, see starships on fire off the shoulder of etc
# time to die ...
Это прекрасно, я видел, как люди делали это раньше. Вот пример кода из одного из списков рассылки Ruby, который запускается при вызове Thread.new:
class MyThread < Thread
def initialize
super("purple monkey dishwasher") {|str| puts "She said, '#{str}.'"}
end
end
Если вы планируете вызвать Thread.fork или Thread.start для запуска вашего потока, вы должны знать об этом из ] Ruby документация по этим методам :
«В основном то же самое, что и Thread :: new. Однако, если класс Thread является подклассом, то вызов start в этом подклассе не вызовет метод инициализации подкласса».
В документации по потоку Ruby упоминается «Если поток является подклассом», поэтому кажется, что все в порядке. Убедитесь, что при инициализации перезаписи вы вызываете super!
На самом деле это не рубиновый способ, но это зависит от того, что вы пытаетесь выполнить с помощью потока.
Во-первых, в Ruby 1.8 на самом деле нет настоящих потоков, поэтому они действительно полезен только для вещей, связанных с вводом-выводом.
Обычно в ruby вы хотите, чтобы что-то выполняло действие в потоке, а не представляло поток, поэтому проще определить обычный класс, который создает потоки внутри для обработки аспекта потоковой передачи.
Наследование - это отношение IS_A