我有一个由宝石定义的类
Diff::LCS
我想为它添加一些方法,所以我想我会扩展它。
现在,我只是通过定义来扩展对象:
object.rb中的class Object
(在我的rails项目的lib /文件夹中)
现在,我的文件在哪里
class Diff::LCS
(试图延长它)
在lib /中再称为diff_lcs.rb。
我是否需要匹配与gem相同的文件夹结构才能正确扩展它?
如何扩展Class :: SubClass?
编辑:添加代码
测试/单元/ diff_lcs_test.rb:
#tests lib/diff_lcs.rb
require "test/unit"
require 'diff/lcs'
require 'diff/lcs/string'
require File.expand_path(File.dirname(__FILE__) + "/../../lib/diff_lcs")
# require '../../lib/diff_lcs.rb'
class DiffLCSTest < Test::Unit::TestCase
def correctly_display_inlineness
@source_text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit..."
@new_text = "lorem ipsUm sit [amet]!, COnsectetur adipisicing elit i have no idea what I'm doing..."
return false
end
end
LIB / diff_lcs.rb:
class Diff::LCS
REMOVED_OPEN = "{*[}"
REMOVED_CLOSE = "{]*}"
ADDED_OPEN = "{*(}"
ADDE_CLOSE = "{)*}"
def self.apply_diff_inline(source_text, new_text)
result = ""
operations = ["-", "+"]
diffs = diff(source_text, new_text)
operations.each do |current_operation|
end
return result
end
end
错误:
> bundle exec ruby test/unit/diff_lcs_test.rb
$ APP_PATH/lib/diff_lcs.rb:1: LCS is not a class (TypeError)
答案 0 :(得分:2)
你的意思是“重新开放”课程(而不是延伸)?如果是这样的话 - 你应该能够完全按照你刚才所说的去做。
class Diff::LCS
def my_new_method
...
end
end
但是 - 你必须要注意加载顺序。如果在原始的Diff:LCS类加载之前加载了您编写上述代码的地方 - 那么您将不会重新打开,而是实际定义该类。
......啊,只是重新阅读你的问题。您正试图弄清楚要将文件命名为什么。以前,您已经依赖于rails的默认命名约定(例如Object在object.rb中),但您不必这样做。只要你在environment.rb(在Rails2中)手动加载它(使用include "whatever_library.rb"
)(或者我认为是Rails3的application.rb),你实际上只需称它为“whatever_library.rb”。
如果必须使用rails default,那么创建一个名为“diff”的目录,然后将代码放在“lcs.rb”文件中。
答案 1 :(得分:0)
您需要做的就是重新打开课程(正如您所做的那样)(假设这是正确的课程名称)。
需要确保包含/需要库。 (具体取决于Rails版本。)