1
votes

Comment retourner une valeur d'une méthode privée à une méthode publique

Je crée un programme en ruby ​​dont je suis nouveau dans le langage et je me demandais comment je retournerais les données d'une méthode privée à une méthode publique alors quand la méthode est appelée sur les données sont affichées

J'ai cherché en ligne, mais étant nouveau dans la langue, j'ai du mal à transférer ce que je vois vers ce dont j'ai besoin dans mon code

def display
    # return calcutalateFrequencies data here
end

private

def calculateFrequencies
  @text = text.downcase.chars.each do |c|
    next if c =~ /\s/
    @letters[c] += 1
  end
end


0 commentaires

3 Réponses :


4
votes

Vous pouvez simplement appeler la méthode privée dans la méthode publique.

def display
  calculateFrequencies
end

Une méthode privée est juste une méthode qui peut UNIQUEMENT être appelée par d'autres méthodes de l'objet, donc ce qui précède est le seule façon dont calculerFréquences fonctionnerait (sauf si vous utilisiez des méthodes spéciales comme send)


2 commentaires

J'ai simplement essayé de l'utiliser dans la méthode d'affichage, mais je n'obtiens pas la sortie requise après avoir obtenu quelque chose du côté totalement opposé de ce que je recherche. dans le terminal IRB, c'est ce avec quoi je me retrouve. irb (main): 007: 0> h.display NoMethodError: méthode non définie with_objects 'for # Voulez-vous dire? with_object from letterHistogram.rb: 15: in CalculateFrequencies 'from letterHistogram.rb: 10: in display' from (irb): 7 from / usr / bin / irb: 11: in < principal> '


@ modzking4 Je pense que si la méthode privée est appelée, votre question est résolue.



3
votes

Cela peut être fait de différentes manières. Puisque vous définissez des variables d'instance, vous pouvez les utiliser ou renvoyer le résultat tel quel.

[J'ai légèrement modifié le code pour qu'il paraisse plus rubis.]

def display
  puts calculateFrequencies("foo bar")
  # or puts @letters
end

private

def calculateFrequencies(text)
  @text = text
  @letters =
    text.downcase.each_char.with_object(Hash.new(0)) do |c, letters|
      next if c == " "
      letters[c] += 1
    end
end


7 commentaires

lors de l'exécution de cela dans IRB sur mon mac, lorsque j'appelle la méthode d'affichage même lorsqu'une chaîne a été transmise, elle doit calculer les fréquences pour que j'obtienne la réponse nulle


Si vous souhaitez renvoyer les fréquences, supprimez met .


que mettrais-je à la place de la "foo bar" à la fin des fréquences calculées qui provoquerait une erreur lors de l'exécution en IRB


il ne calcule pas réellement la quantité de caractères utilisés dans la chaîne lorsque j'appelle la méthode d'affichage, je reçois ceci. irb (main): 007: 0> h.display NoMethodError: méthode non définie with_objects 'for # Voulez-vous dire? with_object from letterHistogram.rb: 15: in CalculateFrequencies 'from letterHistogram.rb: 10: in display' from (irb): 7 from / usr / bin / irb: 11: in < principal> '


Bien sûr que oui. Vous feriez mieux de vérifier si vous pouvez copier-coller ce qui précède sans générer d'erreurs (indice: la méthode with_object ne doit pas avoir de "s" à la fin.)


J'ai vérifié le code et supprimé le "s" à la fin de withobject mais maintenant j'obtiens autre chose que ce que je cherche, dans le terminal IRB je reçois maintenant ceci. h.display NoMethodError: méthode undefined [] 'for nil: NilClass from LetterHistogram.rb: 17: in block in CalculateFrequencies' from LetterHistogram.rb: 15: in each_char 'from LetterHistogram.rb : 15: dans with_object 'de LetterHistogram.rb: 15: dans CalculateFrequencies' de LetterHistogram.rb: 10: dans display 'de (irb): 6 de / usr / bin / irb : 11: dans `

'


Ce problème n'a rien à voir avec la question initiale.



0
votes

Vous avez légèrement modifié la question, mais vous devez prendre en compte les éléments suivants:

    Les méthodes
  • renvoient la dernière instruction exécutée. Si vous faites un chaque comme la dernière instruction exécutée (avec ou sans bloc) le chacun enumerable est retourné.
  • Si la méthode modifie les variables d'instance (comme le vôtre), vous n'aurez peut-être pas besoin de regarder ce qui est retourné par le méthode, affichez simplement les variables d'instance.

Un exemple de faire ce travail ...

FrequencyCalculator.new('Hello World').display

Et puis vous pourriez faire

frequency_calculator = FrequencyCalculator.new('Hello World')
frequency_calculator.display

Ou de manière plus compacte

class FrequencyCalculator

  def initialize(text)
    @text = text
    calculateFrequencies
  end

  def display
    @letters  
  end

  private

  def calculateFrequencies
    @letters = Hash.new(0)
    @text.downcase.chars.each do |c|
      next unless c =~ /\s/  # change from "if" to "unless" otherwise you're skipping letters
      @letters[c] += 1
    end
  end
end 


0 commentaires