为什么在thor文件中打开String类不起作用?

时间:2015-12-22 07:14:24

标签: ruby thor

我知道我可以打开像String这样的类并添加功能。此测试脚本camelize.rb运行良好。

#!/usr/bin/env ruby
class String
  def camelize
    self.split("_").map(&:capitalize).join
  end
end

class Test
  def test
    p "test_me".camelize
  end
end

Test.test

打印"TestMe"

但是在thor文件中,这不起作用。例如。 test.thor

p "TEST ONE"
class String
  p "TEST TWO"
  def camelize
    self.split("_").map(&:capitalize).join
  end
end

class Test < Thor
  p "TEST THREE"
  desc "camel", "A test"
  def camel
    p "test_me".camelize
  end
end

通过thor install test.thor安装,正在运行

$ thor test:camel
"TEST ONE"
"TEST TWO"
"TEST THREE"
/Users/Kassi/.thor/ba3ea78d7f807c4c13ec6b61286788b5:13:in `camel': undefined method `camelize' for "test_me":String (NoMethodError)

为什么以及如何解决它?

1 个答案:

答案 0 :(得分:1)

为什么?

问题是here

Thor::Sandbox.class_eval(content, path)

所以它的作用是将你的文件加载到empty module内,从而命名它(不确定是否符合&#34;沙盒&#34;)。

class Thor
  module Sandbox
  end
end

因此,您重新打开String的尝试实际上创建了一个新的类Thor::Sandbox::String,这是没有人知道的。字符串文字继续创建String的实例。

如何解决?

打开顶级字符串,而不是创建嵌套字符串。

class ::String
  def camelize
    self.split("_").map(&:capitalize).join
  end
end

奖金内容

Thor实际上已经包含了字符串化的方法,Thor::Util.camel_case

  def camel_case(str)
    return str if str !~ /_/ && str =~ /[A-Z]+.*/
    str.split("_").map { |i| i.capitalize }.join
  end