2010-01-02 36 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相同。在這些情況下使用分號不等同,因爲它會導致語法錯誤。在所有其他情況下,它是等同的。