一个人如何将值从私有方法返回到公共方法

时间:2019-01-04 12:40:18

标签: ruby regex

我正在用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 :(得分:4)

您可以只在public方法中调用private方法。

def display
  calculateFrequencies
end

私有方法只是对象中的其他方法只能调用的方法,因此以上是calculateFrequencies起作用的唯一方法(除非您使用的是类似send的特殊方法)

答案 1 :(得分:3)

可以用许多不同的方式完成。由于您正在设置实例变量,因此您可以使用它们或按原样返回结果。

[我对代码进行了一些修改,以使其看起来更红润。]

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

答案 2 :(得分:0)

您已经稍微改变了问题,但是您需要考虑的事项:

  • 方法返回最后执行的语句。如果您将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