ruby pearls

Dec 07, 2016 14:20


2.2.0 :004 > ':xyz'.split(/:/)[0]
=> ""
2.2.0 :005 > ''.split(/:/)[0]
=> nil
2.2.0 :006 > 'xyz'.split(/:/)[0]
=> "xyz"

2.2.0 :001 > weak_key = lambda {|c| c.split(/:/, 2)[0]}
2.2.0 :002 > weak_key('xyz:1986')
NoMethodError: undefined method `weak_key' for main:Object

2.2.0 :003 > def weak_key(x ( Read more... )

Leave a comment

Comments 27

ex_juan_gan December 7 2016, 15:47:01 UTC
Продолжение темы пустого списка...

Reply


nponeccop December 7 2016, 15:56:01 UTC
Так а в первом случае что не так? Что сплит пустой строки - не одноэлементный массив из пустой строки?

Reply

sassa_nf December 7 2016, 16:04:33 UTC
Ага. А что, правильно? По-моему, должно всегда производить массив из number of matches+1.

Reply

vinslivins December 8 2016, 07:45:49 UTC
2.3.0 :022 > '1,2,,4,,6,,,'.split(',', -1)
=> ["1", "2", "", "4", "", "6", "", "", ""]
2.3.0 :023 > '1,2,,4,,6,,,'.split(',')
=> ["1", "2", "", "4", "", "6"]

вот это скорей уже кочка, про которую надо помнить.

Reply

sassa_nf December 8 2016, 07:48:26 UTC
это не просто одна кочка. В документации написано про "positive", "negative" и "missing" лимит. А если ноль? А че пустая строка такая специальная? Ну, с отрицательным лимитом выдал бы пустую строку как одно разбиение, еще можно было бы видеть какую-то логику.

Reply


thedeemon December 7 2016, 16:07:17 UTC
Вы просто не прониклись духом подлинного ООП, где вызов метода это посылка сообщения, определение метода - тоже.

Reply

sassa_nf December 7 2016, 16:08:55 UTC
и что-то еще правильными кложурами и lexical scope не проникся, да

Reply

thedeemon December 7 2016, 16:38:09 UTC
Конечно, определение метода это вам не определение функции какой, с замыканием. Нечего тут! Есть локальные переменные, есть поля объекта, какие еще замыкания, какой еще лексикал скоуп?

Reply

nponeccop December 7 2016, 19:14:03 UTC
Это ты ещё питона не видел! Там трипл фейспалм.

Reply


vinslivins December 8 2016, 07:31:50 UTC
1. тут всё верно:

2.3.0 :001 > ':xyz'.split /:/
=> ["", "xyz"]
2.3.0 :002 > 'xyz'.split /:/
=> ["xyz"]
2.3.0 :003 > ''.split /:/
=> []

2. тут фокус. помним, что в руби синтаксический диабет - и вот лямбды нельзя вызвать круглыми скобками. да и не надо в коде это обычно.

как можно:
2.3.0 :004 > f = lambda {|x| x+2 }
=> #
2.3.0 :005 > f[2 ( ... )

Reply

sassa_nf December 8 2016, 07:40:39 UTC
1. нет, не верно. по какому такому праву пустая строка не производит ни одной строки в массиве?

2. вот это полезно знать, хотя и wtf, как следствие из зоопарка функций, проков, блоков и лямбд.

3. конечно же, это wtf.

Reply

vinslivins December 8 2016, 07:56:59 UTC
1. ну может вы и правы. вырожденный случай какой-то, я думаю можно подогнать свои рассуждения и под текущее поведение. наверное ваше поведение было бы попрактичней. в питоне/перле не так ( ... )

Reply

vinslivins December 8 2016, 08:01:02 UTC
про п.2 - вызов круглыми скобками для лямбд на самом деле тупо не поместился в синтаксис.

подозреваю потому что руби старается не различать переменные и методы

Reply


vinslivins December 8 2016, 07:36:09 UTC
почитал внимательней третий пример.

методы не являются замыканиями.

2.3.0 :007 > def a x
2.3.0 :008?> def b y
2.3.0 :009?> x+y
2.3.0 :010?> end
2.3.0 :011?> b 5
2.3.0 :012?> end
=> :a
2.3.0 :013 > a 3
NameError: undefined local variable or method `x' for main:Object
from (irb):9:in `b'
from (irb):11:in `a'
from (irb):13
from /Users/valt/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `'
2.3.0 :014 >

лямбды, проки, блоки кода - да

Reply

sassa_nf December 8 2016, 07:42:47 UTC
да, и более того, они совсем не локальны - т.е. вот я объявил def в одном месте, а потом с таким же именем def в другом - и куку!

Reply

vinslivins December 8 2016, 07:59:54 UTC
гм. не хочу думать над этим) есть self-вкручивания-методов. с ним не играют. можно дёргать define_instance_method к объектам, и это, пожалуй, максимум практически применимых извращений, если угорать по ООП

Reply

vinslivins December 8 2016, 08:04:26 UTC
а. ну там обычный добровольный самострел в ногу - вызов метода заставляет перетереть метод. это можно юзать, но лучше через явные undefine_method, define_instance_method.

я думаю и в смолтолке можно переопределить гарбадж коллектор или поломать текущий колстек, поизмывавшись над ним.

Reply


Leave a comment

Up