有没有关于不在你的班级名字中输入数字的规则?

时间:2012-01-23 02:01:46

标签: ruby naming-conventions

我正在构建一系列继承自公共类的类。类的实例由此代码(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数字'没有给我任何结果。

4 个答案:

答案 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等。基本上一个好的经验法则是描述你的类是什么,或者如果你有多个,就把它粘在容器数组中。我确实认识到代码是生成的,但我认为它可以做得更好。