gpt4 book ai didi

ruby 错误 : undefined method `[]’ for nil:NilClass

转载 作者:数据小太阳 更新时间:2023-10-29 07:36:43 28 4
gpt4 key购买 nike

我正在学习 Ruby,但我有一个我无法理解的错误。我有一个方法,它接受一个字符串(行)数组并删除所有行直到包含模式的特定行。该方法如下所示:

def removeHeaderLines(lines)
pattern = "..." # Some pattern.

# If the pattern is not there, do not drop any lines.
prefix = lines.take_while {|line| (not line.match(pattern))}
if prefix.length == lines.length then
return prefix
end

# The pattern is there: remove all line preceding it, as well as the line
# containing it.
suffix = (lines.drop_while {|line| (not line.match(pattern))}).drop(1)
return suffix
end

这工作正常并且生成的字符串(行)正确显示在网页上我正在发电。

此外,我想删除该模式之后的所有非空行。我修改了方法如下:

def removeHeaderLines(lines)
pattern = "..." # Some pattern.

# If the pattern is not there, do not drop any lines.
prefix = lines.take_while {|line| (not line.match(pattern))}
if prefix.length == lines.length then
return prefix
end

# The pattern is there: remove all line preceding it, as well as the line
# containing it.
suffix = (lines.drop_while {|line| (not line.match(pattern))}).drop(1)

# Remove leading non-empty lines.
# ADDING THIS INTRODUCES A BUG.
body = suffix.drop_while {|line| (line != "")}
return body
end

非常令人惊讶(至少对我而言)这是行不通的。在生成的网页上,我看到的不是内容,而是错误消息:Liquid error: undefined method `[]' for nil:NilClass。

我无法理解这条消息。据我所知,一些调用我的代码的代码试图访问一个非数组对象,就好像它是一个数组一样。但是两个版本我的方法返回一个字符串数组(变量 suffix 和 body 都设置为一个字符串数组),那么为什么会有区别呢?

因此,不幸的是,由于我对 Ruby 的知识匮乏,我不知道如何调试这个问题。

有人看到上面的代码有什么错误吗?或者,对于导致错误“undefined method `[]’ for nil:NilClass”的原因,是否有人有任何提示?

编辑

附加信息。我正在扩展我自己没有写过的代码(它来自 Octopress ,文件插件/include_code.rb)。原本的渲染代码如下所示:

def render(context)
code_dir = (context.registers[:site].config['code_dir'].sub(/^\//,'') || 'downloads/code')
code_path = (Pathname.new(context.registers[:site].source) + code_dir).expand_path
file = code_path + @file

if File.symlink?(code_path)
return "Code directory '#{code_path}' cannot be a symlink"
end

unless file.file?
return "File #{file} could not be found"
end

Dir.chdir(code_path) do

##################################
# I have replaced the line below #
##################################
code = file.read

@filetype = file.extname.sub('.','') if @filetype.nil?
title = @title ? "#{@title} (#{file.basename})" : file.basename
url = "/#{code_dir}/#{@file}"
source = "<figure class='code'><figcaption><span>#{title}</span> <a href='#{url}'>download</a></figcaption>\n"
source += " #{highlight(code, @filetype)}</figure>"
safe_wrap(source)
end
end

我已经更换了线

code = file.read

code = linesToString(removeHeaderLines(stringToLines(file.read)))

两个缺失的方法是:

def stringToLines(string)
ar = Array.new
string.each_line {|line| ar.push(line)}

return ar
end

def linesToString(lines)
s = ""
lines.each {|line| s.concat(line)}

return s
end

希望对您有所帮助。

编辑 2

感谢哈桑的提示(使用join方法)我找到了问题所在!与 join 方法并行的是 split 方法。所以

"A\nB\n".split(/\n/)

给予

["A", "B"]

而通过使用 each_line(就像我所做的那样),每个行的末尾都带有“\n”。结果

suffix.drop_while {|line| (line != "")}

删除所有行。结果是一个空字符串,显然使库崩溃我在用。感谢 Hassan 指出了一个更惯用的解决方案。我现在有以下:

def removeHeaderLines(code)
lines = code.split(/\r?\n/)
pat = /.../ # Some pattern.
index = lines.index {|line| line =~ pat}
lines = lines.drop(index + 1).drop_while {|line| line != ""} unless index.nil?

lines.join "\n"
end

而且效果很好。

最佳答案

当您尝试像数组(或散列)一样使用 nil 时会发生该异常:

irb(main):001:0> nil[0]
NoMethodError: undefined method `[]' for nil:NilClass
from (irb):1
from /home/mslade/rubygems1.9/bin/irb:12:in `<main>'

或者在变量还没有被初始化的时候使用它作为数组(或散列):

irb(main):005:0> @b[0]
NoMethodError: undefined method `[]' for nil:NilClass
from (irb):5
from /home/mslade/rubygems1.9/bin/irb:12:in `<main>'

寻找您忽略初始化数组的地方,使用类似@b = []

如果您实际上没有使用数组,那么您调用的函数可能需要一个数组。从顶部开始扫描给定的 stak 转储,直到它提到一行代码。然后调查该行以查看您可能遗漏了什么。

关于 ruby 错误 : undefined method `[]’ for nil:NilClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074486/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com