Рубин !Методы или процедуры - PullRequest
0 голосов
/ 24 января 2019

Я хочу изменить variable на месте, реплицируя синтаксис methodname!, а не переназначать новое измененное значение на тот же var. Могу ли я сделать это с proc? Я все еще изучаю procs и вижу, что они весьма полезны и используются правильно.

a = "Santol bag 85.88   www.example.com/products/16785
Shaddock    kg  2.94    www.example.com/products/4109
Palm Fig    5kg 94.34   www.example.com/products/23072
Litchee lb  95.85   www.example.com/products/2557"

a = a.split("\n")

linebreak = Proc.new { |text| text.split("\n") }
linebreak![a]

это первое переназначение кажется громоздким. Я хотел бы посмотреть версию Proc, если смогу выполнить ее в режиме реального времени. Это возможно?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Это, безусловно, возможно, вам просто нужно изменить строку на месте

linebreak = ->(text) { text.replace text.split("\n").join(",") }
a = "foo\nbar"
linebreak[a]
#⇒ "foo,bar"
a
#⇒ "foo,bar"

Что невозможно, так это изменить класс на месте, поэтому split не будет работать (вызываетсястрока, она возвращает массив.)

0 голосов
/ 24 января 2019

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

И в этом случае это невозможно, потому что вы пытаетесь преобразовать строку в массив. Вы должны переназначить переменную:

linebreak = Proc.new { |text| text.split("\n") }
a = linebreak.call(a)
...