Ereditare un oggetto in Ruby

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    CODICE
    class Database
           attr_reader :db
           def initialize
                   @db = SQLite3::Database.new('f.db')
           end
    end
    class Test < Database
           def initialize
                   super
           end
           
           def do # doesn't work with @db and super.db
                   @db.execute("sample_query") # super.db.execute("sample_query")
           end
    end


    Come funziona in questo caso l'ereditarietà in Ruby per richiamare i metodi di un oggetto istanziato nella classe ereditata?
     
    Top
    .
  2. meh.
     
    .

    User deleted


    Intanto non e' necessario l'initialize in Test, visto che viene gia' chiamato quello del padre se presente.

    Secondo non ho capito cosa non va.

    @db e' una variabile d'istanza, quindi accessibile da tutti gli ancestors (anche la classe stessa e' un ancestor).

    super.db non ha alcun senso, super richiama il metodo nel padre rispetto al metodo in cui sei.

    db come metodo e' accessibile a tutti gli ancestors visto che e' un attr_reader pubblico.
     
    Top
    .
  3.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    E da un metodo di classe come richiamo i metodi di @db?
     
    Top
    .
  4. meh.
     
    .

    User deleted


    QUOTE (Roxas Shadow @ 5/2/2012, 16:22) 
    E da un metodo di classe come richiamo i metodi di @db?

    Per metodo di classe intendiamo la stessa cosa? `def self.stocazzo`?

    Non puoi accedere a variabili d'istanza fuori dall'istanza.
     
    Top
    .
  5.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    CITAZIONE (meh. @ 5/2/2012, 16:46) 
    CITAZIONE (Roxas Shadow @ 5/2/2012, 16:22) 
    E da un metodo di classe come richiamo i metodi di @db?

    Per metodo di classe intendiamo la stessa cosa? `def self.stocazzo`?

    Non puoi accedere a variabili d'istanza fuori dall'istanza.

    Esattamente, e dunque come potrei risolvere per vie traverse secondo te senza istanziare ad ogni evocazione di un metodo o passarglielo come parametro?
     
    Top
    .
  6. meh.
     
    .

    User deleted


    QUOTE (Roxas Shadow @ 5/2/2012, 16:55) 
    QUOTE (meh. @ 5/2/2012, 16:46) 
    Per metodo di classe intendiamo la stessa cosa? `def self.stocazzo`?

    Non puoi accedere a variabili d'istanza fuori dall'istanza.

    Esattamente, e dunque come potrei risolvere per vie traverse secondo te senza istanziare ad ogni evocazione di un metodo o passarglielo come parametro?

    Fammi un esempio di cosa hai in mente, perche' secondo me lo stai facendo sbagliato.
     
    Top
    .
  7.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    CODICE
    class Database
           attr_reader :db
           def initialize
                   @db = SQLite3::Database.new('social.db')
                   init_db
           end
           
           def init_db
                   @db.execute('CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY, name TEXT, surname TEXT, nickname TEXT, email TEXT, password TEXT, gender INTEGER)')
                   @db.execute('CREATE TABLE IF NOT EXISTS post (id INTEGER PRIMARY KEY, sender TEXT, recipient TEXT, timestamp TEXT)')
           end
    end
    class User < Database
           attr_accessor :id, :name, :surname, :nickname, :email, :password, :gender
           def initialize(id, name, surname, nickname, email, password, gender)
                   @id = id
                   @name = name
                   @surname = surname
                   @nickname = nickname
                   @email = email
                   @password = password
                   @gender = gender
           end
           
           def User.save(user)
                   for user in u
                           @db.execute("INSERT INTO user(name, surname, nickname, email, password, gender) VALUES('#{u.name}', '#{u.surname}', '#{u.nickname}', '#{u.email}', '#{u.password}', '#{u.gender}')")
                   end
           end
           
           def User.count
                   @db.get_first_value("SELECT COUNT(*) FROM user")
           end
    end
    class Post < Database; end
     
    Top
    .
  8. meh.
     
    .

    User deleted


    Ma perche' non usi DataMapper?

    Poi non usare il for, e' inguardabile.
     
    Top
    .
  9.  
    .
    Avatar


    Group
    Member
    Posts
    6,931

    Status
    Offline
    Si lo so, uso sempre each infatti (:
    Comunque ci sto giocando da un pò, e devo dire che è davvero fantastico DataMapper.
     
    Top
    .
  10. meh.
     
    .

    User deleted


    QUOTE (Roxas Shadow @ 5/2/2012, 18:34) 
    Si lo so, uso sempre each infatti (:
    Comunque ci sto giocando da un pò, e devo dire che è davvero fantastico DataMapper.

    Yep, e' il migliore tra gli ORM per Ruby secondo me.
     
    Top
    .
9 replies since 5/2/2012, 16:03   100 views
  Share  
.