Moduły

Witam po raz kolejny.
Wiem, że nagminnię tu truję… :stuck_out_tongue:
Ale znów mam problem. A mianowicie: postanowiłem owego irc bota podzielić na oddzielne moduły.
Czytałem o load i require. Postanowiłem użyć load. A więc na przykład chciałbym napisać moduł,
pełniący prostą funkcję sprawdzania, czy działa. :smiley:

module Tescik def test(sock) case sock.strip when /^:(.+?)!(.+?)@(.+?)\sPRIVMSG\s(.+)\s:test$/i send "PRIVMSG #{$4} : Dziala." end end end
sock to strumień danych z socketa, który jest odbierany w pliku “głównym” bota. Załóżmy, że ten kod powyżej, to jest plik modul.rb.
No i chcę go załadować i wykorzystać. Tzn zgodnie z wyrażeniem regularnym po napisaniu “test” na kanale
bot powinien wysłać w odpowiedzi: Dziala. Jeśli użyję tego w ten sposób, że dam w pętli wykonanie test(sock) w pliku “głównym” bota, nie przyniesie to oczekiwanego rezultatu. Ba, żadnego rezultatu nie przyniesie. Czyżbym źle do tego podchodził?
Jak powinienem wcielić ten kawałek kodu z modul.rb w “życie”? :stuck_out_tongue:

Moduł musisz nazwać:

module SockTest
...
end

w klasie swojego bota robisz:

class MyBot
  include SockTest
  ...
end

i już możesz używać metod z tego modułu.

Co do nazwania modułu, to wiem. Pisałem “w locie” i przeoczyłem, ale już poprawiłem. :stuck_out_tongue:
Wywala mi błąd: uninitialized constant IRCbot::Tescik (NameError)
Wydaje mi się, że wszystko ok. Nie wiem co może być przyczyną. Kod modułu jak powyżej.
I do tego w klasie bota: include Tescik

moduł Tescik jest w globalnym namespace, a próbuje zaincludować moduł IRCbot::Tescik. Żeby wymusić includowanie z globalnego namespace użyj:

include ::Tescik

Zapisz plik z modułem Tescik pod nazwą tescik.rb. Następnie w pliku z klasą IRCbot zrób:

autoload :Tescik, 'tescik'

lub

require 'tescik'

include opisany przez Huberta powinien wtedy zadziałać.

BTW dobrym pomysłem jest nazywanie klas, metod i zmiennych po ang.

Ok, działa. Dzięki.
Hmm, a dałoby się ładować/wyładowywać moduły jakimś poleceniem?
Z ładowaniem/przeładowywaniem się da, bo widziałem. A wyładować?

Teoretycznie mogłbyś przejść po metodach dostępnych w module i usunąć je z klasy, ale wydaje się to niezłym hackiem. :wink: Co konkretnie chcesz osiągnąć lub jaki problem rozwiązać w ten sposób?

Jak już pisałem wyżej, dzielę irc bota na moduły. Np: mam główny plik bota z obsługą ładowania/wyładowywania modułów, a cała
reszta bota, to już moduły w oddzielnych plikach. Chcę załóżmy, by witał wchodzących na kanał i reagował na słowo “czesc”.
Piszę w tym celu dwa moduły. Każdy w oddzielnym pliku. Jednak chciałbym, aby dało się je “włączać i wyłączać” komendą dla bota.

Może mógłbyś pójść w tym kierunku - https://gist.github.com/3ec987a2ce304a9b5466?

No, mniej więcej łapię o co chodzi. Jak się poduczę w tym kierunku zdaje mi się, że będzie pasować. Dzięki. :smiley: