如何在ruby中扩展子类?

时间:2011-12-06 16:25:34

标签: ruby-on-rails ruby object extend

我有一个由宝石定义的类

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)

2 个答案:

答案 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版本。)