reklama

Pro ruby profíky: záludnost gets, Range-condition

Pro ruby profíky: záludnost gets, Range-condition
« kdy: 23. 04. 2020, 00:53:46 »
V ruby jsou některé věci, na které člověk kouká jako puk, protože je to ohebný jazyk , má magické proměnné a heuristicky odhaduje zda slovo je proměnná nebo metoda ()... Zároveň úžasný...


U tohoto příkladu by mě zajímalo pár věcí.  Striktně bych zde čekal, že (podmíněné)výrazy typu next if /regex/  znamenají provést next pokud /regex/ přetypovaný na bool je true. Zde jazyk jde dál, a nějak nepochopitelně  magicky  proběhne test zadaného textu (na to, že gets magicky uloží vstup do proměnné $_ jsem si zvykl) na pattern. Jenže Nejenže zde není $_, ale není zde ani ~=  , === nebo .match volání.
Zapadá zde do toho nějak case equality operátor?
Proč stačí zapsat pouze regex a o
Kód: [Vybrat]
while gets
  next if /^\s*#/   # skip comments
  break if /^END/   # stop at end
                    # substitute stuff in backticks and try again
  redo if gsub!(/`(.*?)`/) { eval($1) }
  # process line ...




while gets           # assigns line to $_
  if /Ruby/          # matches against $_
    print            # prints $_
  end
end

end

Nebo že print bez argumentů se chová jako print ($_)

Nakonec jsem se to dočetl .
Citace
he gets routine has a side effect: as well as returning the line just read, it also stores it into the global variable $_. This variable is special, in that it is used as the default argument in many circumstances. If you call print with no argument, it prints the contents of $_. If you write an if or while statement with just a regular expression as the condition, that expression is matched against $_.

dají se tyhle "rebarbative barbarismy" najít pohromadě nebo v referenční příručce (dokumentaci tříd)/ manuálu) ? Aby ty WTF momenty člověk si nějak objasnil, našel vysvětlení

Nebo se prostě spokojit s tím, že tahle magie je roztroušená po celém jazyce a občas i zdokumentovaná na nějaké stráce z 800 (viz citace výše)?

reklama


Re:Pro ruby profíky: záludnost gets, Range-condition
« Odpověď #1 kdy: 23. 04. 2020, 07:41:02 »
Na použití globálních proměnných není nic magického. Úplně stejnou globální proměnnou se stejným významem má Perl, má je i standardní knihovna pro C (errno). Seznam globálních proměnných pro Ruby máte zde: Ruby user's guide: Global variables.

Disclaimer: V Ruby jsem nikdy nenapsal ani čárku. Akorát znám magický web www.google.com.

Re:Pro ruby profíky: záludnost gets, Range-condition
« Odpověď #2 kdy: 23. 04. 2020, 09:13:13 »
implicitni matchovani regexu v podmince magicke je.

seznam specialnich promenych https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/variable.html
« Poslední změna: 23. 04. 2020, 09:16:38 od A.P.Hacker »

Re:Pro ruby profíky: záludnost gets, Range-condition
« Odpověď #3 kdy: 23. 04. 2020, 09:26:37 »
proc je to v kategorii /dev/null?

Re:Pro ruby profíky: záludnost gets, Range-condition
« Odpověď #4 kdy: 23. 04. 2020, 10:55:17 »
proc je to v kategorii /dev/null?
Protože Pivotal věčně tapetuje fórum dotazy, na které by odpověď zjistil sám v průměru do pěti minut, kdyby tomu ten čas věnoval. Jenže on prostě místo Googlu používá zdejší fórum.

reklama


Re:Pro ruby profíky: záludnost gets, Range-condition
« Odpověď #5 kdy: 23. 04. 2020, 18:28:20 »
proc je to v kategorii /dev/null?
Protože Pivotal věčně tapetuje fórum dotazy, na které by odpověď zjistil sám v průměru do pěti minut, kdyby tomu ten čas věnoval. Jenže on prostě místo Googlu používá zdejší fórum.

tohle mohla být zajímavá diskuze. Speciální proměnné v Ruby nejsou dobře zdokumentované. Osobně neznám seznam funkcí ze standardní knihovny, které pracují s $_

Re:Pro ruby profíky: záludnost gets, Range-condition
« Odpověď #6 kdy: 23. 04. 2020, 19:55:26 »
tohle mohla být zajímavá diskuze. Speciální proměnné v Ruby nejsou dobře zdokumentované. Osobně neznám seznam funkcí ze standardní knihovny, které pracují s $_
Čím jsou podle vás speciální? Podle mne jsou to normální globální proměnné.

K čemu by takový seznam byl dobrý? Někdy řešíte problém, že máte vstup a přemýšlíte, co by se s ním asi tak dalo dělat? Podle mne je to opačně – máte konkrétní problém, ke kterému jste našel vhodnou metodu, a u té metody už máte zdokumentováno, jaké vstupy ta metoda používá.

Re:Pro ruby profíky: záludnost gets, Range-condition
« Odpověď #7 kdy: 23. 04. 2020, 20:21:04 »
tohle mohla být zajímavá diskuze. Speciální proměnné v Ruby nejsou dobře zdokumentované. Osobně neznám seznam funkcí ze standardní knihovny, které pracují s $_
Čím jsou podle vás speciální? Podle mne jsou to normální globální proměnné.

nazvoslovi z perlu https://perldoc.perl.org/perlvar.html#SPECIAL-VARIABLES

K čemu by takový seznam byl dobrý? Někdy řešíte problém, že máte vstup a přemýšlíte, co by se s ním asi tak dalo dělat? Podle mne je to opačně – máte konkrétní problém, ke kterému jste našel vhodnou metodu, a u té metody už máte zdokumentováno, jaké vstupy ta metoda používá.

protoze neni na prvni pohled ze signatury videt, jestli dana funkce pracuje s $_, je dobre si to pamatovat, alespon u bezne pouzivanych funkci

 

reklama