2009-07-29 4 views
3

ruby를 사용하여 인라인 문에서 블록을 정의 할 수 있습니까? 이런 식으로 뭔가 :이 대신블록을 루비로 인라인으로 정의 할 수 있습니까?

tasks.collect(&:title).to_block{|arr| "#{arr.slice(0, arr.length - 1).join(", ")} and #{arr.last}" } 

:

titles = tasks.collect(&:title) 
"#{titles.slice(0, titles.length - 1).join(", ")} and #{titles.last}" 

당신은 tasks.collect(&:title).slice(0, this.length-1)이 어떻게 '이') 슬라이스 전달 된 전체 배열 (참조 할 수 있다고 말했다 있다면?

기본적으로 하나의 명령문에서 반환 된 객체를 다른 객체로 전달하는 방법을 찾고 있습니다. 반드시 반복하지 않아도됩니다.

답변

4

메서드/함수에 대한 반환 값을 전달하고 반환 된 값에서 메서드를 호출하는 것은 혼란 스러울 수 있습니다. 당신이 설명 일을하는 방법은 이것이다 :

lambda {|arr| "#{arr.slice(0, arr.length - 1).join(", ")} and #{arr.last}"}.call(tasks.collect(&:title)) 

당신이 당신이 시도했던 방법을 수행 할 경우, 가장 가까운 당신이 객체의 컨텍스트 내에서 블록을 실행할 수있는 instance_eval이다. 그래서 될 것이다 : 그것은 더 적은 대안에 비해 읽기의로

tasks.collect(&:title).instance_eval {"#{slice(0, length - 1).join(", ")} and #{last}"} 

그러나, 나는 그 중 하나를 수행하지 않을 것입니다.

1

나는 당신이하려는 정확히 잘 모르겠지만, :

당신은 말했다 경우 tasks.collect (& : 제목) .slice (0, 식에서 나타내지-1) 어떻게 slice()에 전달 된 전체 배열을 'this'라고합니다. 또한

tasks.collect(&:title)[0..-2] 

에서 :

가 음수 사용하여 따옴표와 함께 진행 이상한

"#{titles.slice(0, titles.length - 1).join(", ")} and #{titles.last}" 

당신이있어 뭔가를, 나는 생각한다.

+0

감사합니다. – bwizzy

1

이 시점에서 ...

class Object 
    def to_block 
    yield self 
    end 
end 

당신이 원하는 왜 난 정말 이해가 안 돼요,하지만 당신은 블록을 소요 루비 클래스에 기능을 추가 할 수 있으며, 매개 변수로 자체 전달 당신은 전화를 할 수있을 것입니다 : 물론

tasks.collect(&:title).to_block{|it| it.slice(0, it.length-1)} 

, Object 클래스가 다른 라이브러리와 결합 할 때 심각한 결과가있을 수 있으므로 가볍게해서는 안 수정.

+0

블록을 만들 수있는 방법은 없습니까? 셀프 인라인을 만드시겠습니까? – bwizzy

+0

개체를 매개 변수로 취하고 블록을 취한 전역 함수를 만든 다음 전달 된 매개 변수를 사용하여 블록에서 yield를 호출 할 수 있습니다. 함수는 다음과 같습니다 : def to_block (para) yield para end 그러면 호출은 to_block (tasks.collect (& : title)) {| it | it.slice (0, it.length-1)} 내 의견으로는, 이것은 루비 코드의 자연스런 흐름에 반대하지만, 그렇게 할 수있다. 나는 이것을 조정하는 다른 어떤 방법도 보이지 않는다. – krdluzni

0

많은 좋은 답변이 아마도 당신이 목표의 측면에서 더 이런 식으로 뭔가를 찾고, 여기가 있지만 : 음수에 대해 알고 좋은

class Array 
    def andjoin(separator = ', ', word = ' and ') 
    case (length) 
    when 0 
     '' 
    when 1 
     last.to_s 
    when 2 
     join(word) 
    else 
     slice(0, length - 1).join(separator) + word + last.to_s 
    end 
    end 
end 

puts %w[ think feel enjoy ].andjoin # => "think, feel and enjoy" 
puts %w[ mitchell webb ].andjoin # => "mitchell and webb" 
puts %w[ yes ].andjoin # => "yes" 

puts %w[ happy fun monkeypatch ].andjoin(', ', ', and ') # => "happy, fun, and monkeypatch" 
관련 문제