ruby pearls

Dec. 7th, 2016 02:20 pm
[personal profile] sassa_nf
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)
2.2.0 :004?>   puts "blah"
2.2.0 :005?>   end
 => :weak_key 
2.2.0 :006 > def xyz(x)
2.2.0 :007?>   def weak_key(y)
2.2.0 :008?>     puts x+y
2.2.0 :009?>     end
2.2.0 :010?>   puts "yo"
2.2.0 :011?>   end
 => :xyz 
2.2.0 :012 > weak_key('b')
blah
 => nil 
2.2.0 :013 > xyz('b')
yo
 => nil 
2.2.0 :014 > weak_key('c')
NameError: undefined local variable or method `x' for main:Object
	from (irb):8:in `weak_key'
	from (irb):14
	from /Users/alex/.rvm/rubies/ruby-2.2.0/bin/irb:11:in `<main>'


Idiots.

Date: 2016-12-07 03:47 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Продолжение темы пустого списка...

Date: 2016-12-07 03:56 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Так а в первом случае что не так? Что сплит пустой строки - не одноэлементный массив из пустой строки?

Date: 2016-12-07 04:04 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
Ага. А что, правильно? По-моему, должно всегда производить массив из number of matches+1.

Date: 2016-12-07 04:07 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Вы просто не прониклись духом подлинного ООП, где вызов метода это посылка сообщения, определение метода - тоже.

Date: 2016-12-07 04:08 pm (UTC)
From: [identity profile] sassa-nf.livejournal.com
и что-то еще правильными кложурами и lexical scope не проникся, да

Date: 2016-12-07 04:38 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Конечно, определение метода это вам не определение функции какой, с замыканием. Нечего тут! Есть локальные переменные, есть поля объекта, какие еще замыкания, какой еще лексикал скоуп?

Date: 2016-12-07 05:08 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Пи-исчисление — строгая основа объектно-ориентированного программирования, да.

Date: 2016-12-07 06:43 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Что-то в этом есть, недаром кульминацией ООП стал Эрланг.

Date: 2016-12-07 06:56 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Ага, именно его и вспомнил (ну там не пи, правда).
Только окромя эрланга, никакие из ОО и близко к этой теме (исчисление процессов в основе языка) не подходили.
Ну и не уверен, можно ли эрланг называть ОО ;-)

Date: 2016-12-07 07:14 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Это ты ещё питона не видел! Там трипл фейспалм.

Date: 2016-12-07 07:24 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
У MPI есть стандартные биндинги к С++! И ОО, и message passing в одном флаконе!

Date: 2016-12-07 07:29 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Даа, это они близко подошли к исчислению процессов в основе языка ;-)

Date: 2016-12-08 01:06 am (UTC)
From: [identity profile] nponeccop.livejournal.com
Мне вот кажется, что sound реализации исчислений возможны только в пруверах. Иначе отсутствие необходимости доказывать позволяет им срезать математические углы и получается ерунда.

Мне вот интересно, можно ли нарушить в Эрланге инварианты пи-исчисления. Думаю как два пальца.

Ну и интересно, есть ли industrial unsound provers :)
Edited Date: 2016-12-08 01:08 am (UTC)

Date: 2016-12-08 07:31 am (UTC)
From: [identity profile] vinslivins.livejournal.com
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 }
=> #<proc:0x007f95d7011ae8@(irb):4>
2.3.0 :005 > f[2]
=> 4
2.3.0 :006 > f.call 4
=> 6

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


3. тут вообще не майндфак. руби - динамический язык, от слова совсем. даже не кложа.
важнее другое: руби никогда по своей философии и дизайну не страхует от засовывания пальцев в розетку, поливания себя кипятком (а что, больно же тоже), попытки воткнуть себе вилку в глаз, а потом в руку. (это кстати удобная фича именно данного языка как инструмента)

def внутри def'а не делают.
(теория там такая - есть три вида текущих контекстов - обычный self для переменных, и ещё два - точка ввинчивания методов и точка ввинчивания констант. деф внутри дефа это второй случай. статью могу нагуглить если надо. использовать второе знание обычному программисту, а не писателю хардкорных волшебных библиотек, не нужно)
Edited Date: 2016-12-08 07:33 am (UTC)

Date: 2016-12-08 07:36 am (UTC)
From: [identity profile] vinslivins.livejournal.com
почитал внимательней третий пример.

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

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 >

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

Date: 2016-12-08 07:40 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
1. нет, не верно. по какому такому праву пустая строка не производит ни одной строки в массиве?

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

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

Date: 2016-12-08 07:42 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
да, и более того, они совсем не локальны - т.е. вот я объявил def в одном месте, а потом с таким же именем def в другом - и куку!

Date: 2016-12-08 07:45 am (UTC)
From: [identity profile] vinslivins.livejournal.com
методы динамические. вызов метода перетёр предыдущее определение метода.

а константы лексические. плюс в рельсах (а это обычное применение руби) они сломаны под волшебную загрузку, поэтому рельсы это скорее диалект руби.
Edited Date: 2016-12-08 08:09 am (UTC)

Date: 2016-12-08 07:45 am (UTC)
From: [identity profile] vinslivins.livejournal.com
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"]


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

Date: 2016-12-08 07:48 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
это не просто одна кочка. В документации написано про "positive", "negative" и "missing" лимит. А если ноль? А че пустая строка такая специальная? Ну, с отрицательным лимитом выдал бы пустую строку как одно разбиение, еще можно было бы видеть какую-то логику.
Edited Date: 2016-12-08 07:50 am (UTC)

Date: 2016-12-08 07:56 am (UTC)
From: [identity profile] vinslivins.livejournal.com
1. ну может вы и правы. вырожденный случай какой-то, я думаю можно подогнать свои рассуждения и под текущее поведение. наверное ваше поведение было бы попрактичней. в питоне/перле не так?

(str.split(..).presence || ['']) # вроде, пофиксил.



2. ну ок, вот юскейсы которые можно прогуглить

stabby_syntax = ->(x) {x + 1} # новинка для фанатов

proc_syntax = identity_proc_for_tuples = proc {|(x, y)| [x,y] }

lambdas = lambda {|x, *y| p x; p y; [x,*y] } # example of grabbing rest of args in destructuring and splatting of arrays inside arrays

[1,2].map {|e| e*2}. # "blocks of code"
map do |e|
e + 1
end

кто-то из них совпадает, например колючая лямбда и обычная лямбда. не знаю, на практике это знание нахрен не нужно.




3. ну тогда константы это полный wtf. )
(долго исписывать как это работает, но вкратце
class A::B
class C::D
end
end

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

не в рельсах (в чистом руби) с такими программистами, которые юзают фишку №3 и херню с константами, стараются не работать.
Edited Date: 2016-12-08 07:57 am (UTC)

Date: 2016-12-08 07:59 am (UTC)
From: [identity profile] vinslivins.livejournal.com
гм. не хочу думать над этим) есть self-вкручивания-методов. с ним не играют. можно дёргать define_instance_method к объектам, и это, пожалуй, максимум практически применимых извращений, если угорать по ООП

Date: 2016-12-08 08:01 am (UTC)
From: [identity profile] vinslivins.livejournal.com
про п.2 - вызов круглыми скобками для лямбд на самом деле тупо не поместился в синтаксис.

подозреваю потому что руби старается не различать переменные и методы
Edited Date: 2016-12-08 08:05 am (UTC)

Date: 2016-12-08 08:04 am (UTC)
From: [identity profile] vinslivins.livejournal.com
а. ну там обычный добровольный самострел в ногу - вызов метода заставляет перетереть метод. это можно юзать, но лучше через явные undefine_method, define_instance_method.

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

Date: 2016-12-08 09:40 am (UTC)
From: [identity profile] nivanych.livejournal.com
> sound реализации исчислений возможны только в пруверах

Нет совести и контроля? ;-)
Ну так без инструментов такое доказывать совсем тяжело.
Хоть можно проверить правильность доказательства, это как минимум.
На практике, я уверен, что при таких разработках, сейчас любой возьмёт себе какой-то инструмент в помощь.

http://ru.wikipedia.org/wiki/Эрланг
А я и не знал ;-)

Эрланг же не на пи построен. Нужно выбирать какой из вариантов акторов и проверять.
Палюбому, где-то что-то закралось и несоответствия куда более серьёзные, чем "хаскель не категория".
Но вроде, они же себе такой цели и не ставили, чтоб всё было чОтко согласно какой-то теории.

> industrial unsound provers :)

С вероятностью чтоб просчитывали, что ли?...
Это тестирование получается ;-)
Не совсем, но близко ;-)
Ну или чтоб prover содержал баальшой и хорошо документированный (иначе не industrial!) список исключений из правил. Ну и что, что вся теория вырождается от этих исключений, надо просто аккуратнее! ;-)

Исчисление процессов, это очень не всё, что нужно для распределёнщины.
Это только нижний уровень, база, "ассемблер".
Хотя и конечно, если он весь из себя чОткий, то это сильно упрощает дальнейшую с ним работу.

Date: 2016-12-08 04:56 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
> industrial unsound provers :)

Unsound - это если доказательство, что код удовлетворяет спецификации, не означает, что код удовлетворяет спецификации.

Например, части доказательства, написанные в субботу вечером, используют технику доказательства "мамой клянусь".

Date: 2016-12-08 04:57 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
> Нет совести и контроля?

Не совсем. Необходимо, чтобы в военное время синус мог достигать четырёх.
Page generated May. 22nd, 2026 03:13 am
Powered by Dreamwidth Studios