Производный класс для Потока Ruby?

Получил простую функцию индикатора выполнения, которую я написал на днях:

#!/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 /

8
задан nathan 27 June 2009 в 17:20
поделиться

4 ответа

Я думаю, что это действительно вопрос о моделировании предметной области.

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

Возможно, вы захотите смоделировать какую-то концепцию в своей области с активными объектами. В этом случае лучше использовать стандартный подход 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 ...
11
ответ дан 5 December 2019 в 07:13
поделиться

Это прекрасно, я видел, как люди делали это раньше. Вот пример кода из одного из списков рассылки 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 в этом подклассе не вызовет метод инициализации подкласса».

6
ответ дан 5 December 2019 в 07:13
поделиться

В документации по потоку Ruby упоминается «Если поток является подклассом», поэтому кажется, что все в порядке. Убедитесь, что при инициализации перезаписи вы вызываете super!

1
ответ дан 5 December 2019 в 07:13
поделиться

На самом деле это не рубиновый способ, но это зависит от того, что вы пытаетесь выполнить с помощью потока.

Во-первых, в Ruby 1.8 на самом деле нет настоящих потоков, поэтому они действительно полезен только для вещей, связанных с вводом-выводом.

Обычно в ruby ​​вы хотите, чтобы что-то выполняло действие в потоке, а не представляло поток, поэтому проще определить обычный класс, который создает потоки внутри для обработки аспекта потоковой передачи.

Наследование - это отношение IS_A

0
ответ дан 5 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: