2013-12-04 1 views
1

Я создаю приложение iOS, используя Rubymotion. Мне нужно «преобразовать» часть кода Objective-c в Ruby. Это правильно?Как преобразовать блок Objective-c в Ruby?

Первоначально в Objective-C

[movieWriter setCompletionBlock:^{ 
      [filter removeTarget:movieWriter]; 
      [movieWriter finishRecording]; 
     }]; 

То же самое и в Рубине ?:

movieWriter(setCompletionBlock:-> { filter.removeTarget(movieWriter) }, { movieWriter.finishRecording }) 

ответ

7

No. Синтаксис сообщения посылает в Рубине не object(message:arguments) и синтаксис, имеющий несколько операторов в блоке не являются {statement1} {statement2}. Вместо этого, вы хотите что-то вроде этого:

movieWriter.completionBlock = lambda do 
    filter.removeTarget(movieWriter) 
    movieWriter.finishRecording 
end 

(.. RubyMotion переводит сеттеры как completionBlock= в соответствующий setCompletionBlock: метод Если вы хотите использовать явный метод установки, он будет выглядеть movieWriter.setCompletionBlock(lambda do …))

+0

вы может также сделать: 'movieWriter.completionBlock = лямбда { filter.removeTarget movieWriter movieWriter.finishRecording }' – kixorz

+0

@Napalm: Я не считаю, что это правильный код - в частности, 'movieWriter movieWriter.finishRecording' не может быть прав, так как «movieWriter» явно не является методом. – Chuck

+0

Это 'filter.removeTarget movieWriter' в той же строке. – kixorz