2014-09-18 4 views
4

JRuby를 위해 마츠 루비에서 전환 할 때이 코드 않는 이유 루비 2.0.0p481 (2014년 5월 8일) 64-mingw32]
하지만 1이상한 행동을

def dump_dump 
    get_dump = lambda do 
     return 1 if $n 
     $n = true 
     module_exec &get_dump 
     2 
    end 
    p get_dump[] 
end 

Module.new do 
    module_exec &method(:dump_dump) 
end 

인쇄를 2 in jruby 1.7.15 (1.9.3p392) 2014-09-03 Java HotSpot (TM) 64 비트 서버 VM 012b1.7.0_67-b01 + jit [Windows 8-amd64]에서 82b5cc3?

문제점을 이해하고자합니다.

UPD : 어딘가에보고해야합니까?

답변

0

람다 내부의 'return'은 람다에서 반환되어야하며 메서드에서 반환되지 않아야합니다. 이 까다로운 경우 jruby가 내부 람다를 존중하지 않고 처음 람다 호출로 다시 돌아 오는 것처럼 보입니다.

는 처음에 나는 그것이 람다 내에서 람다 호출에 의해 발생할 수 있습니다 생각했지만, 지금은 그것을 차단 변환을 위해,이 아래의 예를 줄이는 후 관련 문제가 될 생각 :

Module.new do 
    test = lambda do 
    return 
    end 
    module_exec &test 
    puts 'after' 
end 

여기서 mri는 'after'를 인쇄하고, jruby는 아무것도 인쇄하지 않습니다.

...하지만 우리가 변환을 차단하는 람다를하지 않으면합니다 (& 시험) :

Module.new do 
    test = lambda do 
    return 
    end 
    module_exec { test[] } 
    puts 'after' 
end 

MRI와 '후'JRuby를 인쇄 모두 ...

+0

정말로 서로 바꾸지 않았습니까? 내 jruby는 모든 호출을 통해 반환 - 그게 내가 문제를 발견하는 방법입니다. 원래 코드는 나무를 가로 지르며 긴 벡터를 반환해야했지만 jruby는 내 프로그램에서 예외적으로 예외를 제기하면서 아무 것도 던지지 않았습니다. – Nakilon

+0

예 코드를 변경 한 후에 본문에서 했었습니다. 다른 대답으로 업데이트 ... – adzdavies

+0

내가 기억 하듯이, 원래의 코드에서'& test' 대신'{test []} '를 사용하려고 시도했을 때 다른 범위가 있었고 모듈 메소드 등을 보지 못했습니다. 따라서이 대체 방법은 동일하지 않습니다. – Nakilon

2

은 내가 아래에 언제나 그 블럭 안의 return은 정의되지 않은 행동이었습니다. 대신 next을 사용할 수 있습니까? 예를 들어

는 Rubinius 또한이 문제를 가지고 있지만 훨씬 더 명시 적입니다 :

rbx-head :003 > [1].map(&lambda { |n| next -1 }) 
=> [-1] 

이야기의 도덕적 return을한다는 것입니다 : next를 사용 물론

[1].map(&lambda { |n| return -1 }) 
LocalJumpError: unexpected return 

는, 예상 결과를 메서드에 대해 정의되고 Procs 및 lambdas는 메서드가 아닙니다. nextbreak은 차단 호출을 중지하려는 경우 사용할 키워드입니다.

공식 Ruby 사양에서 return의 동작에 대한 문서를 찾을 수 없지만 rubyspec에는 return이 호출하는 메소드를 반환하는지 확인하는 테스트가 있습니다.

https://github.com/rubyspec/rubyspec/blob/master/language/return_spec.rb#L184

+0

블록이 처리해서는 안됩니다. 반환, 오직 주변의 방법. 그러나 람다는 메소드 의미론을 가져야한다. 블록으로 변환 할 때 람다는 람다 상태를 유지합니다. 이것은 참조 용으로 찾은 것입니다. https://gist.github.com/mislav/4508988 – adzdavies

+0

방금 ​​테스트했습니다. MRI에서, 람다는'to_proc'을 호출 할 때 람다 속성을 유지합니다. 반면에 rbx에서는 람다 속성이 손실됩니다 (예 : 누락 된 메서드로 인해 오류가 발생하지 않음). – Max

관련 문제