2009-11-03 5 views
0

Je suis en train d'écrire un programme pour lire des fichiers et rechercher du texte. J'ai écrit les premières étapes initiales. Dans le code ci-dessous, vous pouvez voir un symbole ** - **. Ceci où je veux passer la variable de membre de la classe [CurrentFile].[Ruby]: Passage d'une valeur de membre d'instance de classe à une autre fonction de classe

Veuillez également indiquer quelles améliorations je peux faire dans ce code.

class CurrentFile 
    attr_accessor :currentFileName, :currentFileContent 
    end 

class OpenFile < CurrentFile 
    def OpenFileToRead() #Open file as read-only. 
     thisFile = File.open(** ----- **, 'r') 
     counter = 1 

     begin 
      file = File.new(thisFile, "r") 
      while (line = file.gets) 
      puts "#{counter}: #{line}" 
      counter = counter + 1 
      end 
      file.close 
     rescue => err 
      puts "Exception: #{err}" 
      err 
     end #End of Begin block 
    end #End of OpenFileToRead 
    end #End of Class: OpenFile 

fileToRead = CurrentFile.new #Create instance of CurrentFile Class 
fileToRead.currentFileName = "C:\WorkSpace\SearchText\abc.php" #Set file name to read 
myFile = OpenFile.new #Create instance of OpenFile Class 
+0

Je ne sais pas quel est le problème que vous rencontrez, mais FYI, constructeurs en Ruby sont définis avec 'def initialize', et non 'def ' –

+1

Est-ce votre code actuel? L'erreur que vous avez dit que vous obtenez dans le commentaire de ma réponse ne devrait pas se produire avec ce code. – Chuck

+0

@Chuck: Je suis d'accord. Mis à part le fait qu'il s'agit d'un code * horrible *, il fonctionne très bien lorsque vous le copiez et le collez dans un fichier et que vous l'exécutez. –

Répondre

2

Vous n'avez pas besoin de deux classes.

Depuis OpenFile hérite CurrentFile alors vous avez currentFileName et currentFileContent attributs OpenFile. Cela signifie que vous pouvez utiliser currentFileName dans File.open.

fileToRead = OpenFile.new #Create instance of CurrentFile Class 
fileToRead.currentFileName = "C:\WorkSpace\SearchText\abc.php" #Set file name to read 
fileToRead.OpenFileToRead 

Ou si vous voulez deux classes de passer une instance currentFile comme paramètre à OpenFile et ne héritons pas:

class OpenFile 
    def initialize(file) 
     @file = file 
    end 

    def OpenFileToRead() #Open file as read-only. 
     thisFile = File.open(@file.currentFileName, 'r') 
     counter = 1 

     begin 
      file = File.new(thisFile, "r") 
      while (line = file.gets) 
      puts "#{counter}: #{line}" 
      counter = counter + 1 
      end 
      file.close 
     rescue => err 
      puts "Exception: #{err}" 
      err 
     end 
    end 
    end 

fileToRead = CurrentFile.new #Create instance of CurrentFile Class 
fileToRead.currentFileName = "C:\WorkSpace\SearchText\abc.php" #Set file name to read 
myFile = OpenFile.new(fileToRead) #Create instance of OpenFile Class 
myFile.OpenFileToRead 
0

Je pense que vous voulez juste écrire currentFileName si vous essayez d'accéder à l'attribut currentFileName de cette instance.

+0

@Chuck: Il donne erreur ------- [SearchText.rb: 13: dans 'OpenFileToRead ': méthode non définie' currentFileName' pour CurrentFile: Class (NoMethodError) \t de SearchText.rb: 33 > Quitter code: 1] – RKh

+0

Il n'y a aucune raison de le faire. Et, en fait, si vous copiez et collez simplement le code que vous avez posté dans votre question dans un fichier et que vous l'exécutez, cela fonctionne exactement comme vous l'aviez prévu. (Évidemment, vous devez d'abord appliquer la suggestion de Chuck.) –

+0

@Chuck, @Jorg: Il donne une erreur. Mais comment publier l'extrait de code à nouveau dans ce post? – RKh

Questions connexes