Как можно вернуть значение из закрытого метода в открытый метод - PullRequest
0 голосов
/ 04 января 2019

Я создаю программу на ruby, я новичок в этом языке, и мне было интересно, как мне вернуть данные из закрытого метода в открытый метод, чтобы при вызове метода данные отображались

Я посмотрел в Интернете, но, будучи новичком в этом языке, мне трудно перевести то, что я вижу, в то, что мне нужно в моем коде

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 ]

0 голосов
/ 04 января 2019

Это можно сделать разными способами. Поскольку вы устанавливаете переменные экземпляра, вы можете использовать их или вернуть результат как есть.

[Я немного изменил код, чтобы он выглядел более рубиново.]

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
0 голосов
/ 04 января 2019

Вы немного изменили вопрос, но необходимо учесть следующее:

  • методы возвращают последний выполненный оператор.Если вы используете each в качестве последнего выполненного оператора (с блоком или без него), возвращается перечисляемое значение each.
  • Если метод изменяет переменные экземпляра (как у вас), вам может не понадобиться смотреть на то, что возвращается методом, просто отобразить переменные экземпляра.

Пример созданияэта работа ...

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 

И тогда вы могли бы сделать

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

Или более компактно

FrequencyCalculator.new('Hello World').display
0 голосов
/ 04 января 2019

Вы можете просто вызвать приватный метод в публичном методе.

def display
  calculateFrequencies
end

Закрытый метод - это просто метод, который можно вызывать ТОЛЬКО другими методами в объекте, поэтому вышеприведенный способ является единственным calculateFrequencies, который будет работать (за исключением случаев, когда вы используете специальные методы, такие как send)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...