2010-01-02 62 views
0

您好我有一个奇怪的现象在这里:有分号之间的语义差别和红宝石返回字符

# Is there a semantic difference between these 2 in ruby? 


class MyClass < ClassThatExtendsActiveRecordBase 

... 

# code snippet A: 

    def image_width(size); self.image.width(size); end 

# vs code snippet B 

    def image_width(size) 
    self.image.width(size) 
    end 

end 

我在那里的代码片段一个似乎没有被承认为一个功能 但情况当我通过用分号代替分号来产生B来修改A时,方法被识别(这是红宝石1.8.7)

是否有人能够帮助我理解发生了什么?

+0

嗯,有趣...你能粘贴原始代码吗? – khelll 2010-01-02 13:21:19

回答

2

这两个红宝石之间有语义上的区别吗?

不应该有。并没有,至少与我已经测试的版本:

  • YARV 1.9.2快照红宝石1.9.2dev(2010-01-02躯干26229)[i686的Linux的]
  • YARV 1.9.1p243红宝石1.9.1p243(2009-07-16的修订24175)[I386-的mingw32]
  • MRI 1.8.7p174红宝石1.8.7(2009-06-12 PATCHLEVEL 174)[i686的Linux的]
  • MRI 1.8.6p383红宝石1.8.6(2009-08-04补丁级别383 (Java HotSpot TM客户端VM 1.7)[i386-mingw32]
  • JRuby 1.5快照(1.9模式) jruby 1.5.0.dev(ruby 1.9.2dev trunk 24787)(2009-11-02 6586) (Java HotSpot™客户端)(j2y-java)
  • JRuby 1.5快照(1.8模式) jruby 1.5.0.dev(ruby 1.8.7 patchlevel 174)(2009-11-02 6586) VM 1.7.0-ea)[x86-java]
  • JRuby 1.4.0(1.9模式) jruby 1.4.0(ruby 1.9.2dev trunk 24787)(2009-11-02 69fbfa3)(Java HotSpot(TM) )客户端VM 1.7.0-ea)[x86-java]
  • JRuby 1.4.0(1.8 mo de) jruby 1.4.0(2009-11-02 69fbfa3)(Java HotSpot TM Client VM 1.7.0-ea)[x86-java]
  • JRuby 1.3.1 (1.9模式) jruby 1.3.1(ruby 1.8.6p287)(2009-06-15 2fd6c3d)(Java HotSpot(TM)Client VM 1.6.0_14)[i386-java]
  • JRuby 1.3.1(1.8模式)的jruby 1.3.1(红宝石1.9.1p0)(2009-06-15 2fd6c3d)(爪哇的HotSpot(TM)客户机VM 1.6.0_14)[I386-java的]
  • 的IronRuby IronRuby的0.9.1.0上。 NET 4.0.0.0
  • IronRuby .NET 2.0.0上的IronRuby 0.9.2.0。0

既然您发布的代码示例是不完整的,甚至不正确地分析,我用了一个稍作修改的版本进行测试:

class C < Object 
    def semicolon(arg); self.foo(arg); end 

    def newlines(arg) 
    self.foo(arg) 
    end 

    def really_short(arg) foo(arg) end 

    def foo(arg) arg end 
end 

require 'test/unit' 
class TestMethodDefinition < Test::Unit::TestCase 
    def test_that_semicolons_work 
    assert_equal :foo, C.new.semicolon(:foo) 
    end 
    def test_that_newlines_work 
    assert_equal :foo, C.new.newlines(:foo) 
    end 
    def test_that_really_short_definitions_work 
    assert_equal :foo, C.new.really_short(:foo) 
    end 
end 

你写

[.. 。]似乎并未被视为功能

你是什么意思? Ruby没有这样的功能,所以功能不起作用的事实不应该令人惊讶。

此外,您认为“认可”是什么意思?这个词在编程中有着非常明确的含义,但是你似乎并没有在这个意义上使用它。

最后,这是什么意思,它“出现”不工作?它是否或不工作?

你能提供一个完整的最小测试用例表现出你所看到的行为?另外,请介绍:

  • 什么是你期待
  • 行为为什么你认为应该发生
  • 这种行为是什么行为,你是实际上观察
  • 是什么确切你正在收到的错误消息

目前,它看起来像一个非常微妙的错误在你的具体Ruby的安装。

+0

谢谢Jörg,你非常有帮助。我遇到问题时发现一个最小的测试用例 - 当我像你一样去除它时,它会消失。如果我管理我会跟进。 – 2010-01-03 02:15:30

2

在某些情况下,换行符会被忽略。例如

1 + 
2 

1 + 2相同。在这些情况下使用分号不等同,因为它会导致语法错误。在所有其他情况下,它是等同的。