Pull to refresh

Comments 13

Спасибо за ссылку, этого я не видел еще :) Тема навеяна после более детального изучения руби. На сколько я знаю в версии 1.9, такой магии уже нет.
“I found lambda!” — Matz
Спасибо вам, уважаемый — держите плюс в карму:)
Жаль, что не затронута тема нового в Ruby 1.9.1 синтексиса ламбды…
Было:
c = lambda {|a, b| [b, a] }
c.call(1, 2)
Стало:
c = ->(a, b) { [b, a] }
c.(1,2)
Благодарю :) Если честно, на руби 1.9 еще не переходил даже, после некоторых проблем с кодировками, решил повременить :)
Но на сколько мне известно, в новых рубях нету всей этой запутанности с лямбдами и проками.
кстати, yugui.jp/articles/846 очередная мозговыносная статья для рубиста :)) Чем больше познаю язык, тем он красивее :))))
UFO just landed and posted this here
Несколько странно выглядит сравнение методов и proc-объектов. Дело в том, что методы в руби не являются обектами. Их конечно можно преобразовать к proc — но это уже другая история.
Статья несомненно интересная, большое спасибо.

P.S. proc-объекты в ruby1.9.X стали умнее, взять хотя бы те же умолчательные значения для передаваемых параметров :)
Дело в том, что методы в руби не являются обектами. Их конечно можно преобразовать к proc — но это уже другая история.

Должно быть вы путаете с блоками. Методы вполне себе могут быть объектами класса Method, а как раз блоки только преобразовывать в proc.
Я говорил, о методах, но как выходит ошибался. Действительно есть класс Method, но метод new у него отсутствует.

ruby-1.9.2-p0 > Method.new
NoMethodError: undefined method `new' for Method:Class
	from (irb):15
	from /home/saks/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'
</ore>

Что немного смущает...
>> class MyClass
>>   def initialize(value)
>>     @x = value
>>   end
>>   def my_method
>>     @x
>>   end
>> end
=> nil

>> obj = MyClass.new(1)
=> #<MyClass:0x00000001cdb210 @x=1>
>> m = obj.method :my_method
=> #<Method: MyClass#my_method>
>> m.class
=> Method
>> m.call
=> 1
>> 

Method.new и не нужен.
При таком объявлении — не нужен, но было бы логично и ожидаемо, если бы методы можно было создавать
при помощи метода new, а потом например привязывать к объектам, классам (как методы класса) или вызывать в контексте какого-либо объекта, как например в javascript с помощью call и apply это делается.

А так получается, что есть ключевое слово def (вроде это именно ключевое слово, не оператор), и есть методы define_method / define_singleton_method… Ну можно через eval ещё создать динамически метод, но это не вариант.

И получается, что методы то объекты, но вот создаются — не как все, а как-то по особенному, что не соответствует принципу наименьшего удивления. Хотя ruby пытаются делать как можно более логичным.
блоки и Процедуры и лямбды — это разные вещи. Блок не является объектом, это просто код заключенный в do...end или {}, а процедуры и лямды являются объектами, которые состоят из принимаемых при создании нового экземпляра класса Proc блоков.
Sign up to leave a comment.

Articles