我正在构建一系列继承自公共类的类。类的实例由此代码(props to this guy)构建:
def self.create(service, logger)
classified_name = service.name.to_s.split('_').collect! { |w| w.capitalize }.join << "Processor"
service_proc = Object.const_get(classified_name).new
service_proc.logger = logger ||= Rails::logger
好的,所以一切正常,直到我遇到名称中有数字的服务。这似乎是一个坏主意,但在这种情况下,处理器以名称中包含数字的外部服务命名。我决定保留这个数字以避免混淆。 “HTBB”没有任何意义,而“H2B”实际上是在我的应用程序的上下文中。
嗯,突然创建方法死了:
NoMethodError: undefined method `logger=' for #<H2bProcessor:0xb737f20>
好的,奇怪的。请记住,我有4个其他类由同一工厂方法构建。 Logger是基类的属性。所以我搞砸了一下,然后决定数字可能搞砸了。所以我尝试在类的名称中加载带有和不带数字的文件:
>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
TypeError: superclass mismatch for class H2bProcessor
from /mnt/hgfs/kodiak/lib/processors/H2b_processor.rb:1:in `<top (required)>'
[...]
[change the 2 in the name to "To"]
[...]
>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
=> true
好的,问题解决了。然而,它确实让我感到疑惑:在类的名称中是否有数字以某种方式搞砸了Ruby?我google了一下但不知道要搜索什么,比如'命名约定ruby数字'没有给我任何结果。
答案 0 :(得分:3)
一开始你不允许有号码,否则你应该是对的。
class H2O
end
H2O.new # Works fine
class 2Extreme
end
SyntaxError: compile error
(irb):5: trailing `E' in number
class 2Extreme
^
(irb):5: syntax error, unexpected tIDENTIFIER, expecting tCOLON2 or '[' or '.'
from (irb):6
from :0
答案 1 :(得分:1)
NoMethodError: undefined method `logger=' for #<H2bProcessor:0xb737f20>
看着这条消息,类加载似乎成功了。我认为它只是简单没有'logger ='方法。
对于以下错误,look at this question。您收到错误,因为已经有H2bPrecessor类。
>> load("/mnt/hgfs/kodiak/lib/processors/H2b_processor.rb")
TypeError: superclass mismatch for class H2bProcessor
答案 2 :(得分:0)
这个问题与数字无关。创建类名时,您没有正确地大写。
归结为最简单的"h2b".capitalize => "H2b"
,而不是"H2B"
。
你不想要一个H2bProcessor
,你想要一个H2BProcessor
,所以而不是
"h2b".to_s.split('_').collect! { |w| w.capitalize }.join << "Processor"
=> "H2bProcessor"
使用
"h2b".to_s.split(/_|(?<=\d)/).collect! { |w| w.capitalize }.join << "Processor" => "H2BProcessor"
String#split
方法采用文字字符串或正则表达式。正则表达式将字符串拆分为下划线或数字串。此数组["h2", "b"]
的每个元素都单独大写,["H2", "B"]
,然后数组连接生成字符串"H2B"
,最后"Processor"
被推送到字符串的末尾。< / p>
答案 3 :(得分:-4)
一般来说,开始输入数字并不是很好的编码实践。我最喜欢的是Textbox1,Textbox2等。基本上一个好的经验法则是描述你的类是什么,或者如果你有多个,就把它粘在容器数组中。我确实认识到代码是生成的,但我认为它可以做得更好。