From robert_kuzelj at yahoo.com Wed Feb 23 14:07:28 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Wed Feb 23 14:02:35 2005 Subject: [Ruby-de-talk] net/protocol.rb & Name or service not known (SocketError) Message-ID: <421CD470.5090805@yahoo.com> hi, hab gerade ein kleines (grosses) problem beim zugriff auf eine http-url. ich bekomme immer folgende stacktrace unter linux /usr/lib/ruby/1.8/net/protocol.rb:83:in `initialize': getaddrinfo: Name or service not known (SocketError) from /usr/lib/ruby/1.8/net/protocol.rb:83:in `new' from /usr/lib/ruby/1.8/net/protocol.rb:83:in `connect' from /usr/lib/ruby/1.8/net/protocol.rb:82:in `timeout' from /usr/lib/ruby/1.8/timeout.rb:55:in `timeout' from /usr/lib/ruby/1.8/net/protocol.rb:82:in `connect' from /usr/lib/ruby/1.8/net/protocol.rb:64:in `initialize' from /usr/lib/ruby/1.8/net/http.rb:430:in `open' from /usr/lib/ruby/1.8/net/http.rb:430:in `do_start' from /usr/lib/ruby/1.8/net/http.rb:419:in `start' from /usr/lib/ruby/1.8/net/http.rb:824:in `request' from /usr/lib/ruby/1.8/net/http.rb:618:in `get' from dd-live-test.rb:6 hab zwar in google einige seiten gefunden, die das problem auch beschreiben; nur eine loesung fand ich keine. das programm dazu ist simple genug require 'net/http' h = Net::HTTP.new('http://www.yahoo.com', 8080) resp, data = h.get('/index.html', nil ) puts "Code = #{resp.code}" puts "Message = #{resp.message}" irgendeiner irgendeine idee? umgebung: suse 9.2 ruby 1.8.1 und 1.8.2 danke From s at xss.de Wed Feb 23 14:26:46 2005 From: s at xss.de (Stefan Schmiedl) Date: Wed Feb 23 14:22:56 2005 Subject: [Ruby-de-talk] net/protocol.rb & Name or service not known (SocketError) In-Reply-To: <421CD470.5090805@yahoo.com> References: <421CD470.5090805@yahoo.com> Message-ID: <20050223192646.GB21656@workhorse> robert kuzelj (2005-02-23 20:07): > require 'net/http' > > h = Net::HTTP.new('http://www.yahoo.com', 8080) h = Net::HTTP.new('www.yahoo.com', 80) > resp, data = h.get('/index.html', nil ) > puts "Code = #{resp.code}" > puts "Message = #{resp.message}" > viel spa?! s. -- Stefan Schmiedl +-------------------------------+----------------------------------------+ |Approximity GmbH | EDV-Beratung Schmiedl | |http://www.approximity.com | Am Br?uweiher 4, 93499 Zandt, Germany | |mailto:stefan@approximity.com | Tel. (09944) 3068-98, Fax -97 | +-------------------------------+----------------------------------------+ From detlef.reichl at gmx.org Wed Feb 23 14:29:32 2005 From: detlef.reichl at gmx.org (Detlef Reichl) Date: Wed Feb 23 14:26:40 2005 Subject: [Ruby-de-talk] net/protocol.rb & Name or service not known (SocketError) In-Reply-To: <421CD470.5090805@yahoo.com> References: <421CD470.5090805@yahoo.com> Message-ID: <1109186973.5387.11.camel@localhost.localdomain> On Mi, 2005-02-23 at 20:07 +0100, robert kuzelj wrote: >hi, > >hab gerade ein kleines (grosses) problem beim zugriff >auf eine http-url. ich bekomme immer folgende stacktrace unter >linux hallo, >das programm dazu ist simple genug >require 'net/http' > >h = Net::HTTP.new('http://www.yahoo.com', 8080) sollte sein: h = Net::HTTP.new('www.yahoo.com', 8080) >resp, data = h.get('/index.html', nil ) und resp = h.get('/index.html') >puts "Code = #{resp.code}" >puts "Message = #{resp.message}" > >irgendeiner irgendeine idee? > gruss detlef From robert_kuzelj at yahoo.com Wed Feb 23 15:00:21 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Wed Feb 23 14:55:29 2005 Subject: [Ruby-de-talk] woher bekomm ich ruby openssl? war: (net/protocol.rb & Name or service not known (SocketError)) In-Reply-To: <20050223192646.GB21656@workhorse> References: <421CD470.5090805@yahoo.com> <20050223192646.GB21656@workhorse> Message-ID: <421CE0D5.5060209@yahoo.com> >>require 'net/http' >> >>h = Net::HTTP.new('http://www.yahoo.com', 8080) > > > h = Net::HTTP.new('www.yahoo.com', 80) danke! das klappt nu. allerdings will eigentlich auf eine https-resource zugreifen. dazu brauche ich unter linux natuerlich openssl (das ist installiert) und die ruby-bindings. das problem ist blos wo bekomm ich die her. http://rpmfind.net/linux/rpm2html/search.php?query=ruby-openssl hier find ich zwei rpms (binary und source) aber das binary laesst sich nicht installieren und beim source werden die sourcen irgendwo hingepackt. runterladen der sourcen direkt aus dem CVS klappt auch nicht. http://www.nongnu.org/rubypki/ braucht ewig und bekommt irgendwann einen timeout: >>> Logging in to :pserver:anoncvs@subversions.gnu.org:2401/cvsroot/rubypki CVS password: cvs [login aborted]: connect to subversions.gnu.org(199.232.41.3):2401 failed: Connection timed out <<< es hat zufaelligerweise keiner ein rpm fuer suse 9.2 rumliegen? oder vieleicht wenigstens die sourcen als tar gepackt? oder vieleicht weiss einer wo die sourcen beim installieren des rpms hingepackt werden. >>> jupiter # rpm -Uhv ruby-openssl-0.2.0pre2-1.src.rpm warning: ruby-openssl-0.2.0pre2-1.src.rpm: V3 DSA signature: NOKEY, key ID bfbaf0e8 1:ruby-openssl warning: user ianmacd does not exist - using root) ########################################### [100%] <<< ciao robertj From s at xss.de Thu Feb 24 05:28:32 2005 From: s at xss.de (Stefan Schmiedl) Date: Thu Feb 24 05:24:44 2005 Subject: [Ruby-de-talk] Ruby war im Radio! Message-ID: <20050224102832.GA1495@workhorse> Ich hab's zwar nicht selber geh?rt, aber nach Ohrenzeugenberichten scheint es gut gewesen zu sein: http://www.br-online.de/wissen-bildung/kalenderblatt/2005/02/kb20050224.html s. From pit at capitain.de Thu Feb 24 06:32:35 2005 From: pit at capitain.de (Pit Capitain) Date: Thu Feb 24 06:27:47 2005 Subject: [Ruby-de-talk] Ruby war im Radio! In-Reply-To: <20050224102832.GA1495@workhorse> References: <20050224102832.GA1495@workhorse> Message-ID: <421DBB53.2070404@capitain.de> Stefan Schmiedl schrieb: > Ich hab's zwar nicht selber geh?rt, aber nach Ohrenzeugenberichten > scheint es gut gewesen zu sein: > > http://www.br-online.de/wissen-bildung/kalenderblatt/2005/02/kb20050224.html Cool! W?re das nicht auch eine Nachricht in ruby-talk wert? Gru?, Pit From robert_kuzelj at yahoo.com Thu Feb 24 07:19:13 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Thu Feb 24 07:14:16 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string Message-ID: <421DC641.9060202@yahoo.com> myhash = {"eins" => 1, "zwei" => 2} str = "eins: #{eins}, zwei: #{zwei}" result = str % myhash geht das oder wenn nicht wie gehts? ciao robertj From robert_kuzelj at yahoo.com Thu Feb 24 08:55:49 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Thu Feb 24 08:50:51 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421DC641.9060202@yahoo.com> References: <421DC641.9060202@yahoo.com> Message-ID: <421DDCE5.9010907@yahoo.com> robert kuzelj wrote: > myhash = {"eins" => 1, "zwei" => 2} > str = "eins: #{eins}, zwei: #{zwei}" > > result = str % myhash > > geht das oder wenn nicht wie gehts? hab mir jetzt was eigenes gebaut...aber so richtig zufrieden bin ich nicht. es muss doch was eingebautes geben, dass das macht oder? class Expander def initialize(_template, _values) _values.each do |key, value| _template.gsub!(/(\#\{#{key}\})/, "#{value}") end @result = _template end def to_s return @result end end s = Expander.new 'Eins: #{eins}, Zwei: #{zwei}', {"eins" => 111, "zwei" => 222} puts s.to_s ergibt >>> Eins: 111, Zwei: 222 ciao robertj From dblack at wobblini.net Thu Feb 24 09:47:27 2005 From: dblack at wobblini.net (David A. Black) Date: Thu Feb 24 09:43:36 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421DDCE5.9010907@yahoo.com> References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> Message-ID: Hi -- On Thu, 24 Feb 2005, robert kuzelj wrote: > robert kuzelj wrote: >> myhash = {"eins" => 1, "zwei" => 2} >> str = "eins: #{eins}, zwei: #{zwei}" >> >> result = str % myhash >> >> geht das oder wenn nicht wie gehts? > > hab mir jetzt was eigenes gebaut...aber so richtig zufrieden bin > ich nicht. es muss doch was eingebautes geben, dass das macht > oder? > > class Expander > def initialize(_template, _values) Aus reiner Neugier: warum die fuehrenden '_'s ? David -- David A. Black dblack@wobblini.net From robert_kuzelj at yahoo.com Thu Feb 24 10:13:59 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Thu Feb 24 10:09:02 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> Message-ID: <421DEF37.3040400@yahoo.com> > Aus reiner Neugier: warum die fuehrenden '_'s ? unsere java programmierrichtlinien. instanzvariablen: lowercases + underscore am ende parameter: underscore + lowercases local vars: lowercases hat den schonene effekt, dass man den gueltigkeitsbereich einer variable sehr schnerr erfasst. fuer instanz vars brauch ich natuerlich unter ruby nix. die sind ja schon durch ein @ gekennzeichnet ciao robertj From dblack at wobblini.net Thu Feb 24 11:21:29 2005 From: dblack at wobblini.net (David A. Black) Date: Thu Feb 24 11:17:38 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421DEF37.3040400@yahoo.com> References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> Message-ID: Hi -- On Thu, 24 Feb 2005, robert kuzelj wrote: >> Aus reiner Neugier: warum die fuehrenden '_'s ? > unsere java programmierrichtlinien. ^^^^ Ach so, Java steckt dahinter :-) > instanzvariablen: lowercases + underscore am ende > parameter: underscore + lowercases > local vars: lowercases > > hat den schonene effekt, dass man den gueltigkeitsbereich > einer variable sehr schnerr erfasst. Auf mir leider nicht :-) Danke sowieso fuer die Erklaerung. David -- David A. Black dblack@wobblini.net From chneukirchen at gmail.com Thu Feb 24 11:50:18 2005 From: chneukirchen at gmail.com (Christian Neukirchen) Date: Thu Feb 24 11:46:31 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: (David A. Black's message of "Thu, 24 Feb 2005 08:21:29 -0800 (PST)") References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> Message-ID: "David A. Black" writes: > Hi -- > > On Thu, 24 Feb 2005, robert kuzelj wrote: > >>> Aus reiner Neugier: warum die fuehrenden '_'s ? >> unsere java programmierrichtlinien. > ^^^^ > Ach so, Java steckt dahinter :-) > >> instanzvariablen: lowercases + underscore am ende >> parameter: underscore + lowercases >> local vars: lowercases >> >> hat den schonene effekt, dass man den gueltigkeitsbereich >> einer variable sehr schnerr erfasst. > > Auf mir leider nicht :-) Danke sowieso fuer die Erklaerung. H?rt sich aus meiner Sicht auch eher eklig an. :-) > David -- Christian Neukirchen http://chneukirchen.org From robert_kuzelj at yahoo.com Thu Feb 24 11:59:02 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Thu Feb 24 11:54:04 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> Message-ID: <421E07D6.60003@yahoo.com> >>Ach so, Java steckt dahinter :-) >> >> >>>instanzvariablen: lowercases + underscore am ende >>>parameter: underscore + lowercases >>>local vars: lowercases >>> >>>hat den schonene effekt, dass man den gueltigkeitsbereich >>>einer variable sehr schnerr erfasst. >> >>Auf mir leider nicht :-) Danke sowieso fuer die Erklaerung. > > > H?rt sich aus meiner Sicht auch eher eklig an. :-) jungs, probieren geht ueber studieren. das ganze ist ein wenig wie die ungarische notation fuer den scope von variablen. im uebrigen hat ruby ja schon was aehnliches. @ fuer instanz variablen und KAPITAELCHEN fuer konstanten (zugebenermassen konstanten sind kein scoping konzept in ruby). also warum keinen eindeutigen hinweis auf ein parameter? ciao robertj From chneukirchen at gmail.com Thu Feb 24 12:47:32 2005 From: chneukirchen at gmail.com (Christian Neukirchen) Date: Thu Feb 24 12:43:47 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421E07D6.60003@yahoo.com> (robert kuzelj's message of "Thu, 24 Feb 2005 17:59:02 +0100") References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> <421E07D6.60003@yahoo.com> Message-ID: robert kuzelj writes: >>>Ach so, Java steckt dahinter :-) >>> >>> >>>>instanzvariablen: lowercases + underscore am ende >>>>parameter: underscore + lowercases >>>>local vars: lowercases >>>> >>>>hat den schonene effekt, dass man den gueltigkeitsbereich >>>>einer variable sehr schnerr erfasst. >>> >>>Auf mir leider nicht :-) Danke sowieso fuer die Erklaerung. >> H?rt sich aus meiner Sicht auch eher eklig an. :-) > jungs, probieren geht ueber studieren. > das ganze ist ein wenig wie die ungarische notation > fuer den scope von variablen. Ungarische Notation ist schlimmer. :-) > im uebrigen hat ruby > ja schon was aehnliches. ... aber besser. > @ fuer instanz variablen > und KAPITAELCHEN fuer konstanten (zugebenermassen > konstanten sind kein scoping konzept in ruby). Das sind keine Kapit?lchen, sondern Versalien. > also warum keinen eindeutigen hinweis auf ein parameter? Weil Methoden so kurz sein sollten, dass man 1) die Parameterzeile soweiso sieht, 2) keinen Variablennamen doppelt verwenden w?rde, 3) es keinen unterschied zwischen Parametern und lokalen Variablen gibt. Sorry, aber bei class Foo def initalize(_foo) bar = _foo * 2 @foo_ = bar / 7 end end kommts mir hoch :-) > ciao robertj -- Christian Neukirchen http://chneukirchen.org From robert_kuzelj at yahoo.com Thu Feb 24 13:35:25 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Thu Feb 24 13:30:27 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> <421E07D6.60003@yahoo.com> Message-ID: <421E1E6D.2070209@yahoo.com> >>im uebrigen hat ruby >>ja schon was aehnliches. > > ... aber besser. natuerlich besser. wie koennt es anders sein ;-) > Das sind keine Kapit?lchen, sondern Versalien. mea culpa. du hast natuerlich recht. > Weil Methoden so kurz sein sollten, dass man > 1) die Parameterzeile soweiso sieht, das magische wort dabei ist "sollte". wobei ich gerne zugebe, dass die wahrscheinlichkeit, dass es so ist in ruby hoeher ist als in java. > 2) keinen Variablennamen doppelt verwenden w?rde, ich auch nicht und die meisten sprachen verhindern das. > 3) es keinen unterschied zwischen Parametern und lokalen Variablen gibt. uiuiui 010 def changeit(_param) 020 value = MyType.new 030 040 _param.changeStateOfInstance 050 value.changeStateOfInstance 060 070 end 080 090 value = MyType.new 100 changeit(value) ich wuerd mal behaupten ob ich eine lokale variable manipuliere oder einen parameter kann schon eine erhebliche auswirkung auf den system zustand haben. und deswegen find ich es durchaus wichtig einen parameter kenntlich zu machen. > Sorry, aber bei > > class Foo > def initalize(_foo) > bar = _foo * 2 > @foo_ = bar / 7 > end > end wie gesagt, da ruby ja schon einen marker fuer instanzvars hat, ist der unterstrich nicht noetig. > kommts mir hoch :-) du, ich muss dich gar nicht ueberzeugen. wenn du meinst, dass es fuer dich und dein team nicht notwendig ist: more power to you! wenn du in meinem team arbeiten wuerdest, wuerdest du es lieben ;-) ciao robertj From robert_kuzelj at yahoo.com Thu Feb 24 13:40:26 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Thu Feb 24 13:35:26 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421E1A07.7050706@yahoo.com> References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421E0D1E.2000706@capitain.de> <421E1A07.7050706@yahoo.com> Message-ID: <421E1F9A.8060902@yahoo.com> hi pit, > eingebaut ist nur die normale String-Interpolation "...#{wert}...", die du ja kennst. Wenn du in deinem Template nicht die Ausdr?cke "eins", "zwei" etc. verwenden w?rdest, sondern z.B. "myhash['eins']", "myhash['zwei']", dann k?nntest du das Template mit eval(%Q{"#{template}"}) expandieren. Oder, vielleicht einfacher zu lesen: eval('"' + template + '"'). > > h = {"eins" => 111, "zwei" => 222} > t = 'Eins: #{h["eins"]}, Zwei: #{h["zwei"]}' > > s = eval(%Q{"#{t}"}) > puts s # => Eins: 111, Zwei: 222 och noe, das gefaellt mir nicht ;-) das ist schon wesentlich besser. hab aber ein paar fragen. 010 def expand(template, values) 020 b = binding 030 v = nil 040 values.each do |name, value| 050 v = value 060 eval("#{name} = v", b) 070 end 080 eval(%Q{"#{template}"}) 090 end 100 110 s = expand('Eins: #{eins}, Zwei: #{zwei}', {"eins" => 111, "zwei" => 222}) 120 puts s # => Eins: 111, Zwei: 222 soweit ich aus der doku verstanden habe holt sich Kernel::binding die variablen bindings zum zeitpunkt des aufrufs um es zb. spaeter in einem aufruf von eval nutzen zu koennen. nun ist aber zb. v, welches du in eval nutzt noch gar nicht definiert. warum gibt das keinen fehler? und schliesslich was um gottes willen macht %Q ? danke robertj From chneukirchen at gmail.com Thu Feb 24 13:42:50 2005 From: chneukirchen at gmail.com (Christian Neukirchen) Date: Thu Feb 24 13:39:05 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421E1E6D.2070209@yahoo.com> (robert kuzelj's message of "Thu, 24 Feb 2005 19:35:25 +0100") References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> <421E07D6.60003@yahoo.com> <421E1E6D.2070209@yahoo.com> Message-ID: robert kuzelj writes: >> Weil Methoden so kurz sein sollten, dass man >> 1) die Parameterzeile soweiso sieht, > das magische wort dabei ist "sollte". wobei ich gerne zugebe, > dass die wahrscheinlichkeit, dass es so ist in ruby hoeher > ist als in java. Da hast du wohl recht :-) >> 2) keinen Variablennamen doppelt verwenden w?rde, > ich auch nicht und die meisten sprachen verhindern das. Tun sie das? >> 3) es keinen unterschied zwischen Parametern und lokalen Variablen gibt. > uiuiui > > 010 def changeit(_param) > 020 value = MyType.new > 030 > 040 _param.changeStateOfInstance > 050 value.changeStateOfInstance > 060 > 070 end > 080 > 090 value = MyType.new > 100 changeit(value) => Kein Unterschied! > ich wuerd mal behaupten ob ich eine lokale variable manipuliere oder > einen parameter kann schon eine erhebliche auswirkung auf den system > zustand haben. und deswegen find ich es durchaus wichtig einen parameter > kenntlich zu machen. Habe ich ganz ehrlich noch nie gesehen, dass das jemand macht in Ruby... *und*: def changeit(_param) value = _param value.fuckup! end macht das gleiche! (Die h?sslichen Basic-Zeilennummern lass ich mal weg...) Man muss also allgemein vorsichtig mit destruktiven Operatoren sein. >> kommts mir hoch :-) > du, ich muss dich gar nicht ueberzeugen. wenn du meinst, dass es fuer > dich und dein team nicht notwendig ist: more power to you! > wenn du in meinem team arbeiten wuerdest, wuerdest du es lieben ;-) Ich will aber nicht in ein Java-Team. *pl?rr* > ciao robertj Gruss, -- Christian Neukirchen http://chneukirchen.org From dblack at wobblini.net Thu Feb 24 14:17:51 2005 From: dblack at wobblini.net (David A. Black) Date: Thu Feb 24 14:14:00 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421E1E6D.2070209@yahoo.com> References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> <421E07D6.60003@yahoo.com> <421E1E6D.2070209@yahoo.com> Message-ID: Hi -- On Thu, 24 Feb 2005, robert kuzelj wrote: >>> im uebrigen hat ruby >>> ja schon was aehnliches. >> >> ... aber besser. > natuerlich besser. wie koennt es anders sein ;-) > >> Das sind keine Kapitälchen, sondern Versalien. > mea culpa. du hast natuerlich recht. > >> Weil Methoden so kurz sein sollten, dass man >> 1) die Parameterzeile soweiso sieht, > das magische wort dabei ist "sollte". wobei ich gerne zugebe, > dass die wahrscheinlichkeit, dass es so ist in ruby hoeher > ist als in java. > >> 2) keinen Variablennamen doppelt verwenden würde, > ich auch nicht und die meisten sprachen verhindern das. > >> 3) es keinen unterschied zwischen Parametern und lokalen Variablen gibt. > uiuiui > > 010 def changeit(_param) > 020 value = MyType.new > 030 > 040 _param.changeStateOfInstance > 050 value.changeStateOfInstance > 060 > 070 end > 080 > 090 value = MyType.new > 100 changeit(value) Ob dieses Beispiel aber einen wesentlichen Unterschied wirklich zeigt, oder eher einen Fall des allgemeinen Prizips, Variablen seien lauter Referenzhaelter? Ich wuerde sagen: Params sind eindeutig Lokalvariablen, die von anderen Vars nur dadurch zu unterscheiden sind, dass sie ihren Werte durch arglist-Syntax bekommen. Uebrigens soll es dem Autor der Methode ganz klar sein, welche Vars als Params geboren sind, und welche nicht. Das '_' kann dabei nicht helfen -- denn wenn man nicht weiss, welche die Paramnamen sind, kann man das '_' im richtigen Platz ueberhaupt nicht tippen :-) David -- David A. Black dblack@wobblini.net From chneukirchen at gmail.com Thu Feb 24 14:41:35 2005 From: chneukirchen at gmail.com (Christian Neukirchen) Date: Thu Feb 24 14:37:48 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421E1F9A.8060902@yahoo.com> (robert kuzelj's message of "Thu, 24 Feb 2005 19:40:26 +0100") References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421E0D1E.2000706@capitain.de> <421E1A07.7050706@yahoo.com> <421E1F9A.8060902@yahoo.com> Message-ID: robert kuzelj writes: > hi pit, > > > eingebaut ist nur die normale String-Interpolation "...#{wert}...", > die du ja kennst. Wenn du in deinem Template nicht die Ausdr?cke > "eins", "zwei" etc. verwenden w?rdest, sondern > z.B. "myhash['eins']", "myhash['zwei']", dann k?nntest du das > Template mit eval(%Q{"#{template}"}) expandieren. Oder, vielleicht > einfacher zu lesen: eval('"' + template + '"'). > > > > h = {"eins" => 111, "zwei" => 222} > > t = 'Eins: #{h["eins"]}, Zwei: #{h["zwei"]}' > > > > s = eval(%Q{"#{t}"}) > > puts s # => Eins: 111, Zwei: 222 > > och noe, das gefaellt mir nicht ;-) > > das ist schon wesentlich besser. hab aber ein paar fragen. > 010 def expand(template, values) > 020 b = binding > 030 v = nil > 040 values.each do |name, value| > 050 v = value > 060 eval("#{name} = v", b) > 070 end > 080 eval(%Q{"#{template}"}) > 090 end > 100 > 110 s = expand('Eins: #{eins}, Zwei: #{zwei}', {"eins" => 111, "zwei" => > 222}) > 120 puts s # => Eins: 111, Zwei: 222 Wenn man sowieso einen Hash ?bergibt: def expand(template, values) template.gsub(/\#{(\w+)}/) { values[$1] } end Ungetestet. > soweit ich aus der doku verstanden habe holt sich Kernel::binding > die variablen bindings zum zeitpunkt des aufrufs um es zb. spaeter > in einem aufruf von eval nutzen zu koennen. nun ist aber zb. v, > welches du in eval nutzt noch gar nicht definiert. warum gibt das > keinen fehler? > und schliesslich was um gottes willen macht %Q ? %Q{...} => '...' Statt {} k?nnen auch andere Klammern oder (fast) beliebige Zeichen verwendet werden. > danke Bitte sehr, -- Christian Neukirchen http://chneukirchen.org From pit at capitain.de Thu Feb 24 15:04:47 2005 From: pit at capitain.de (Pit Capitain) Date: Thu Feb 24 15:00:08 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421E1F9A.8060902@yahoo.com> References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421E0D1E.2000706@capitain.de> <421E1A07.7050706@yahoo.com> <421E1F9A.8060902@yahoo.com> Message-ID: <421E335F.5040700@capitain.de> robert kuzelj schrieb: > das ist schon wesentlich besser. hab aber ein paar fragen. Gerne. Der Code ist leider nicht so leicht zu verstehen. > 010 def expand(template, values) > 020 b = binding > 030 v = nil > 040 values.each do |name, value| > 050 v = value > 060 eval("#{name} = v", b) > 070 end > 080 eval(%Q{"#{template}"}) > 090 end > 100 > 110 s = expand('Eins: #{eins}, Zwei: #{zwei}', {"eins" => 111, "zwei" => > 222}) > 120 puts s # => Eins: 111, Zwei: 222 Zun?chst mal nutze ich eval, um die Variablen zu erzeugen. Hierbei ist zu beachten, dass man mit eval zwar neue lokale Variablen erzeugen kann, diese aber au?erhalb von eval nicht sichtbar sind: eval("a = 1") puts a # => undefined local variable or method `a' Man kann allerdings auf diese Variablen auch sp?ter noch mit eval zugreifen: puts(eval("a")) # => 1 Da das Template am Ende sowieso mit eval ausgewertet werden sollte, hat mir dieses Verhalten gereicht. Ich habe den Code erst mal ohne Binding und ohne die Variable v ausprobiert. Dabei hat sich gezeigt, dass ich innerhalb des each Blocks zwar auf die neuen Variablen zugreifen konnte, diese aber au?erhalb des Blocks nicht mehr sichtbar waren. Also gilt auch f?r die mit eval angelegten lokalen Variablen dasselbe wie bei normalen lokalen Variablen: wenn sie erst in einem Block neu angelegt werden, sind sie au?erhalb des Blocks nicht mehr sichtbar: 1.times do a = 1 end puts a # => undefined local variable or method `a' Daher habe ich dann den zweiten Parameter von eval benutzt, um die Variablen im Kontext des ?u?eren Codes zu erzeugen. Daf?r brauchte ich dann wiederum die Variable v aus dem ?u?eren Kontext, um die Werte setzen zu k?nnen. So ist dann letztlich dieser Code entstanden. > soweit ich aus der doku verstanden habe holt sich Kernel::binding > die variablen bindings zum zeitpunkt des aufrufs um es zb. spaeter > in einem aufruf von eval nutzen zu koennen. nun ist aber zb. v, > welches du in eval nutzt noch gar nicht definiert. warum gibt das > keinen fehler? Mit binding bekommt man keinen Snapshot der aktuellen Variablen-Bindungen, sondern eben nur den Kontext f?r die Variablen. Sp?tere ?nderungen in diesem Kontext sind dann nach wie vor ?ber das vorher erzeugte Binding-Objekt sichtbar. > und schliesslich was um gottes willen macht %Q ? Ich wollte das Template ja mit eval auswerten und brauchte daf?r einen String, der einen String-Ausdruck enth?lt. Ich brauchte also Anf?hrungszeichen vor und hinter dem Template. Das h?tte ich mit '"' + template + '"' machen k?nnen, aber normalerweise verwende ich die "...#{wert}..." Schreibweise, um Strings zusammenzubauen: "\"#{template}\"" Hier haben mich aber die \ vor den Anf?hrungszeichen etwas gest?rt, und um ein Konstrukt zu ?ben, das ich bisher nur selten verwendet habe, habe ich den speziellen Quoting-Mechanismus von Ruby verwendet. Siehe hierzu z.B. http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_stdtypes.html#S2 Gru?, Pit From robert_kuzelj at yahoo.com Thu Feb 24 15:05:27 2005 From: robert_kuzelj at yahoo.com (robert kuzelj) Date: Thu Feb 24 15:00:28 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421DEF37.3040400@yahoo.com> <421E07D6.60003@yahoo.com> <421E1E6D.2070209@yahoo.com> Message-ID: <421E3387.3050604@yahoo.com> hi david, > Ob dieses Beispiel aber einen wesentlichen Unterschied wirklich zeigt, > oder eher einen Fall des allgemeinen Prizips, Variablen seien lauter > Referenzhaelter? Ich wuerde sagen: Params sind eindeutig > Lokalvariablen, die von anderen Vars nur dadurch zu unterscheiden > sind, dass sie ihren Werte durch arglist-Syntax bekommen. natuerlich hast du recht dass sich eine lokale variable nicht von einem param unterscheidet was die prinzipiellen moeglichkeiten der host-sprache selbst angeht (zumindest die, die ich benutze machen da keinen unterschied). aber mir geht es nicht um die auswirkung der sprache sondern es geht mir um den systemischen aspekt _meines_ software system. UND da macht es sehrwohl einen unterscheid ob ich eine lokale variable oder einen parameter manipuliere. > Uebrigens soll es dem Autor der Methode ganz klar sein, welche Vars > als Params geboren sind, und welche nicht. Das '_' kann dabei nicht der unterstrich hilft eben genau dabei. jederzeit zu wissen was ein param ist und was nicht. natuerlich ist das nur ein hilfsmittel und es gibt massig wege dieses hilfsmittel in sein gegenteil zu verkehren. aber das macht den ansatz nicht invalide. > helfen -- denn wenn man nicht weiss, welche die Paramnamen sind, kann > man das '_' im richtigen Platz ueberhaupt nicht tippen :-) eine gute java-idee (intellij) kann da schon wunder wirken. es muss schon gruende geben warum dies ein gebraeuchliches idiom in java ist: void doit(MyType _mt) { MyType mt = (MyType) _mt.clone(); mt.ichMachMitDirWasIchWill(); } oder wenn ich das original doch aendern will MyType doit(MyType _mt) { MyType mt = (MyType) _mt.clone(); mt.ichMachMitDirWasIchWill(); return mt; } MyType mt = new MyType(); mt = doit(mt); oder wenn ichs etwas objekt orientierter haben will sogar mit doit als methode von MyType. dann siehts halt so aus. MyType doit() { MyType mt = (MyType) this.clone(); mt.ichMachMitDirWasIchWill(); return mt; } MyType mt = new MyType(); mt = mt.doit(); wer eher defensiv programmieren will/muss. kommt um sowas nicht herum. das gilt fuer java, python, ruby usw. solange ich meine methode nicht so deklarieren kann void doit(*const* MyType _mt) wie das unter c++ moeglich ist, finde ich ein unterstrich einen zahlenswerten preis fuer einen aufmerksamkeitshinweis. ok. und nu lassen wir die diskussion. unser team hat mit diesem kleinen trick, der (ich weiss) sich ganz leicht aushebeln laesst, gute erfahrung gemacht. also werd ich ihn auch in ruby nutzen. ciao robertj From pit at capitain.de Thu Feb 24 15:11:07 2005 From: pit at capitain.de (Pit Capitain) Date: Thu Feb 24 15:06:29 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421E0D1E.2000706@capitain.de> <421E1A07.7050706@yahoo.com> <421E1F9A.8060902@yahoo.com> Message-ID: <421E34DB.5020902@capitain.de> Christian Neukirchen schrieb: > > def expand(template, values) > template.gsub(/\#{(\w+)}/) { values[$1] } > end Diese L?sung gef?llt mir auch besser als mein Code von vorhin, weil er kein eval benutzt (sicherer) und au?erdem k?rzer und viel verst?ndlicher ist. Das sch?ne an diesem Job/Hobby ist, dass man - wenn man bereit dazu ist - nie auslernt. Gru?, Pit From chneukirchen at gmail.com Thu Feb 24 15:53:26 2005 From: chneukirchen at gmail.com (Christian Neukirchen) Date: Thu Feb 24 15:49:42 2005 Subject: [Ruby-de-talk] wie expandiere ich hashvalues in einem string In-Reply-To: <421E34DB.5020902@capitain.de> (Pit Capitain's message of "Thu, 24 Feb 2005 21:11:07 +0100") References: <421DC641.9060202@yahoo.com> <421DDCE5.9010907@yahoo.com> <421E0D1E.2000706@capitain.de> <421E1A07.7050706@yahoo.com> <421E1F9A.8060902@yahoo.com> <421E34DB.5020902@capitain.de> Message-ID: Pit Capitain writes: > Christian Neukirchen schrieb: >> def expand(template, values) >> template.gsub(/\#{(\w+)}/) { values[$1] } >> end > > Diese L?sung gef?llt mir auch besser als mein Code von vorhin, weil er > kein eval benutzt (sicherer) und au?erdem k?rzer und viel > verst?ndlicher ist. Das sch?ne an diesem Job/Hobby ist, dass man - Und schneller. :-) > wenn man bereit dazu ist - nie auslernt. Sobald man sowas ?fter braucht, empfiehlt es sich allerdings, sich mal einige "richtige" Template-Engines anzuschauen. > Gru?, > Pit Gruss, -- Christian Neukirchen http://chneukirchen.org