Gsub! przetwarza również wartość w parametrze. Błąd języka?

Witam,
trafiłem na dość dziwne zachowanie języka ruby. Przykładowo, mam metodę, która jako argument przyjmuje łańcuch znaków i w efekcie zwraca nowy łańcuch znaków.

irb(main):001:0> a = 'witaj jak sie masz' => "witaj jak sie masz" irb(main):002:0> def test input irb(main):003:1> b = input irb(main):004:1> b.gsub!('witaj', 'dupeczko') irb(main):005:1> end => nil irb(main):006:0> test a => "dupeczko jak sie masz" irb(main):007:0> a => "dupeczko jak sie masz" irb(main):008:0>
Dlaczego gsub! przetworzył również wartość zmiennej w parametrze ?

Pozdrawiam, exage

użyj gsub bez “!”

def test(input) input.gsub('foo', 'bar') end
w rubym zazwyczaj zaleca się używania metod bez !, zwracają one zmienioną wartość zamiast zmieniania “w miejscu” co pozwala uniknąć takich właśnie błędów :slight_smile:

jeżeli już musisz użyć gsub! (tylko dlaczego? :D) to:

def test(input) b = input.dup b.gsub!('foo', 'bar') end

Wiem na czym polega różnica, pytanie czy coś takiego powinno być dopuszczalne. Może zgłosić gdzieś ten błąd ?
Teoretycznie może naruszyć bezpieczeństwo aplikacji.

Jaki błąd? Ruby tak działa, że domyślnie przekazujesz referencję do obiektu, a nie jego kopię.

Naruszyć bezpieczeństwo w tym przypadku może jedynie niekompetencja programisty, jeżeli nie wie kiedy może używać takiej metody, a kiedy nie powinien.

[quote=exage]Wiem na czym polega różnica, pytanie czy coś takiego powinno być dopuszczalne. Może zgłosić gdzieś ten błąd ?
Teoretycznie może naruszyć bezpieczeństwo aplikacji.[/quote]
Facepalm I’m dead :smiley: Przeczytaj dokumentację.

Hm, nie wiedziałem, że to jest ‘referencja do obiektu’. Dzięki za wyjaśnienie.

Uwierz w 99.9999% przypadków możesz spokojnie założyć że to ty popełniłeś błąd, a nie błąd znajduje sie w języku, czy bibliotece standardowej.

W pozostałych wypadkach pozostaje zgłaszanie błędów.