我知道我可以打开像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)
为什么以及如何解决它?
答案 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