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
3 Réponses :
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)
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 # 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.
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
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 # 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.
Vous avez légèrement modifié la question, mais vous devez prendre en compte les éléments suivants:
chaque comme
la dernière instruction exécutée (avec ou sans bloc) le chacun
enumerable est retourné. 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