在Ruby中使用yield时出错

时间:2015-02-15 14:11:39

标签: ruby

我是ruby的新手,我正在努力学习收益率如何运作。我使用yield以下列方式在函数的帮助下读取文件中的字符。该函数的返回值被输入到另一个基于空格提取单词的函数。但是,执行时出现以下错误:

in `block (2 levels) in getchars': no block given (yield) (LocalJumpError)

以下是代码段生成错误:

def getchars(file)
    IO.readlines(file).each {|line| line.each_char {|chrc| yield chrc }}
end

有人可以帮我理解我做错了什么吗?感谢。

增加:

这就是我打电话的方式:

def getwords(file)
  @st_char = true
  getchars(file).each {|c|
    if @st_char == true
        @word = ""
        if c.match(/^[[:alnum:]]+$/)
            @word = c
            @st_char = false
        end
    else
        if c.match(/^[[:alnum:]]+$/)
            @word = @word + c
        else
            @st_char = true
            yield @word
    end
  end
}
end

3 个答案:

答案 0 :(得分:1)

我认为错误消息非常明确:getchars尝试yield到块,但是调用getchars的人都没有通过块。

getwords的第2行,您调用getchars而不传递阻止。您需要将一个块传递给getchars,因此它有yield到。

答案 1 :(得分:1)

您需要将代码块传递给getchars才能获得。

之类的,

getchars("example.txt") {|char| puts char}

然后在你的get chars中,它会一次一个地生成一个char到提供的代码块 - 只需puts它们就可以了。

答案 2 :(得分:-1)

file_as_string = File.read("greetings.txt") # => "hey hello hola vanakam"
array_of_words_after_splitting_by_spaces = file_as_string.split(" ") # => ["hey", "hello", "hola", "vanakam"]

警告:请不要使用此类变量名称,只是用它来明确查看发生的事情