我正在尝试在 Ruby 中使用 require
命令。我正在使用 CodeRunner 来运行我的代码。我遇到的问题是 require 语句只是使用字符串“chunky_png”。我有一个文件夹,里面装满了这段代码需要使用的库文件。我不确定 A) 将文件夹放在哪里和 B) 如果我需要以某种方式指向该文件夹?这是我的代码,下面是我遇到的错误。我的库文件文件夹与我尝试运行的 PNGdecode.rb 文件位于同一文件夹中:
require 'chunky_png'
class ChunkyPNG::Image
def at(x,y)
ChunkyPNG::Color.to_grayscale_bytes(self[x,y]).first
end
end
img = ChunkyPNG::Image.from_file('engine.png')
sobel_x = [[-1,0,1],
[-2,0,2],
[-1,0,1]]
sobel_y = [[-1,-2,-1],
[0 , 0, 0],
[1 , 2, 1]]
edge = ChunkyPNG::Image.new(img.width, img.height, ChunkyPNG::Color::TRANSPARENT)
for x in 1..img.width-2
for y in 1..img.height-2
pixel_x = (sobel_x[0][0] * img.at(x-1,y-1)) + (sobel_x[0][1] * img.at(x,y-1)) + (sobel_x[0][2] * img.at(x+1,y-1)) +
(sobel_x[1][0] * img.at(x-1,y)) + (sobel_x[1][1] * img.at(x,y)) + (sobel_x[1][2] * img.at(x+1,y)) +
(sobel_x[2][0] * img.at(x-1,y+1)) + (sobel_x[2][1] * img.at(x,y+1)) + (sobel_x[2][2] * img.at(x+1,y+1))
pixel_y = (sobel_y[0][0] * img.at(x-1,y-1)) + (sobel_y[0][1] * img.at(x,y-1)) + (sobel_y[0][2] * img.at(x+1,y-1)) +
(sobel_y[1][0] * img.at(x-1,y)) + (sobel_y[1][1] * img.at(x,y)) + (sobel_y[1][2] * img.at(x+1,y)) +
(sobel_y[2][0] * img.at(x-1,y+1)) + (sobel_y[2][1] * img.at(x,y+1)) + (sobel_y[2][2] * img.at(x+1,y+1))
val = Math.sqrt((pixel_x * pixel_x) + (pixel_y * pixel_y)).ceil
edge[x,y] = ChunkyPNG::Color.grayscale(val)
end
end
edge.save('engine_edge.png')
错误:
PNGdecode.rb:1:in `require': no such file to load -- chunky_png (LoadError)
最佳答案
嗯,实际上 chunky_png
是 gem ,即库包。您应该通过 RubyGems ruby 打包系统安装它。
首先,安装RubyGems如果尚未安装。 (如果你可以输入gem
命令,并且显示帮助,则进行第二步)
其次,使用命令安装此gem:
gem install chunky_png
这不仅会下载这个库,还会下载它的依赖项,以这样一种方式安装和配置它们,你可以从 any 目录中执行 require 'chunky_png'
而无需带走所有的库文件。
这是在 Ruby 中安装外部库的正常方法。
注意:如果您使用的是 Ubuntu Linux 系统并且您希望在系统范围内安装 gem(对于所有用户)
注意 2: 如果您最终想要分发需要 gem 的 Ruby 应用程序,您最好使用 Bundler这样其他人就可以自动安装您的所有依赖项,而无需解析错误消息并逐个手动安装所需的 gem
关于Ruby Require 语句和文件位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14584867/