Fórum Root.cz

Ostatní => /dev/null => Téma založeno: Ħαℓ₸℮ℵ ␏⫢ ⦚ » 23. 04. 2020, 00:53:46

Název: Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Ħαℓ₸℮ℵ ␏⫢ ⦚ » 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 (http://ruby-doc.com/docs/ProgrammingRuby/html/language.html) 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 (http://ruby-doc.com/docs/ProgrammingRuby/html/tut_expressions.html#S5) 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ů  (http://ruby-doc.com/docs/ProgrammingRuby/html/ref_m_kernel.html#Kernel.print)se chová jako print ($_)

Nakonec jsem se to dočetl (http://ruby-doc.com/docs/ProgrammingRuby/) .
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)?
Název: Re:Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Filip Jirsák 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 (https://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/globalvars.html).

Disclaimer: V Ruby jsem nikdy nenapsal ani čárku. Akorát znám magický web www.google.com.
Název: Re:Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Google CTCCTCGGCGGGCACGTAG 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
Název: Re:Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Google CTCCTCGGCGGGCACGTAG 23. 04. 2020, 09:26:37
proc je to v kategorii /dev/null?
Název: Re:Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Filip Jirsák 23. 04. 2020, 10:55:17
proc je to v kategorii /dev/null?
Protože (https://forum.root.cz/index.php?topic=22835.msg328438#msg328438) 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.
Název: Re:Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Google CTCCTCGGCGGGCACGTAG 23. 04. 2020, 18:28:20
proc je to v kategorii /dev/null?
Protože (https://forum.root.cz/index.php?topic=22835.msg328438#msg328438) 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 $_
Název: Re:Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Filip Jirsák 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á.
Název: Re:Pro ruby profíky: záludnost gets, Range-condition
Přispěvatel: Google CTCCTCGGCGGGCACGTAG 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