learn-ruby-in-kansai:2332
From: Daisuke Furukawa <mogya@m...>
Date: Tue, 21 Sep 2010 10:24:14 +0900
Subject: [learn-ruby-in-kansai:2332] Re: [learn-ruby-in-kansai] メーリングリスト停止のご案内
> doc = open(url) {|f| REXML::Document.new f.read } おぉお。ブロック付きのopenって評価結果を返すのですね。勉強になります。 > lo, la = REXML::XPath.first(doc.root, '//coordinates').text.split(/,/) > { > 'longitude' => lo.to_f, > 'latitude' => la.to_f > } 美しい・・・こんなにインデントが減らせるとは思いませんでした。 そして、やっぱり最後のreturnは書かないのが主流なのですねぇ。理屈は分かっているのですけど、なんだか書かないと落ち着かないです。 /Furukawa 2010年9月21日10:00 ujihisa <ujihisa@g...>: > リファクタリングしてみました。 > > > --- before.rb 2010-09-20 17:53:42.000000000 -0700 > +++ after.rb 2010-09-20 17:58:48.000000000 -0700 > @@ -1,26 +1,15 @@ > -def getGeoPoints(q) > - ret = Hash.new > - $URL = "http://maps.google.com/maps/geo?" > +def getpoints(q) > # q = '北海道岩見沢市八条東10丁目2-55' > - url = $URL + {'q' => q, 'output' => 'xml'}.map { |key, value| > + url = "http://maps.google.com/maps/geo?" + {'q' => q, 'output' => > 'xml'}.map {|key, value| > "#{CGI.escape(key)}=#{CGI.escape(value)}" > }.join('&') > > - # 読み取る > - open(url) do |f| > - xml = f.read > - doc = REXML::Document.new(xml) > + doc = open(url) {|f| REXML::Document.new f.read } > > - # coordinates タグの中身を読み取る > - status = REXML::XPath.first(doc.root, '//code').text > - if (status=='200') > - latlng = REXML::XPath.first(doc.root, '//coordinates').text > - ret['longitude'], ret['latitude'] = latlng.split(/,/) > - ret['longitude'] = ret['longitude'].to_f > - ret['latitude'] = ret['latitude'].to_f > - else > - ret = nil > - end > - end > - return ret > + return unless REXML::XPath.first(doc.root, '//code').text == '200' > + lo, la = REXML::XPath.first(doc.root, '//coordinates').text.split(/,/) > + { > + 'longitude' => lo.to_f, > + 'latitude' => la.to_f > + } > end > > > 適用するとこんな感じになります。 > > def getpoints(q) > # q = '北海道岩見沢市八条東10丁目2-55' > url = "http://maps.google.com/maps/geo?" + {'q' => q, 'output' => > 'xml'}.map {|key, value| > "#{CGI.escape(key)}=#{CGI.escape(value)}" > }.join('&') > > doc = open(url) {|f| REXML::Document.new f.read } > > return unless REXML::XPath.first(doc.root, '//code').text == '200' > lo, la = REXML::XPath.first(doc.root, '//coordinates').text.split(/,/) > { > 'longitude' => lo.to_f, > 'latitude' => la.to_f > } > end > > # メソッド名がかわっているので正しいリファクタリングではないですね・・・。 > > 2010/9/20 Daisuke Furukawa <mogya@m...>: >> なんですって。それは大変だ! >> じゃあ、最近書いたコードの中から、GoogleMapsAPIを使って住所を緯度経度に変換する関数を貼り付けてみます。 >> >> def getGeoPoints(q) >> ret = Hash.new >> $URL = "http://maps.google.com/maps/geo?" >> # q = '北海道岩見沢市八条東10丁目2-55' >> url = $URL + {'q' => q, 'output' => 'xml'}.map { |key, value| >> "#{CGI.escape(key)}=#{CGI.escape(value)}" >> }.join('&') >> >> # 読み取る >> open(url) do |f| >> xml = f.read >> doc = REXML::Document.new(xml) >> >> # coordinates タグの中身を読み取る >> status = REXML::XPath.first(doc.root, '//code').text >> if (status=='200') >> latlng = REXML::XPath.first(doc.root, '//coordinates').text >> ret['longitude'], ret['latitude'] = latlng.split(/,/) >> ret['longitude'] = ret['longitude'].to_f >> ret['latitude'] = ret['latitude'].to_f >> else >> ret = nil >> end >> end >> return ret >> end >> >> 2010年9月21日8:55 ujihisa <ujihisa@g...>: >>> 聞いた話によりますと、最近書いた美しいコード辺をここに貼付けないとメーリングリストが停止されるとのことです。 >>> >>> -- >>> ML: learn-ruby-in-kansai@r... >>> 使い方: http://QuickML.com/ >>> >> >> -- >> ML: learn-ruby-in-kansai@r... >> 使い方: http://QuickML.com/ >> > > -- > ML: learn-ruby-in-kansai@r... > 使い方: http://QuickML.com/ > -- 古川 大輔(Furukawa Daisuke) ホームページ「もぎゃんらんど」 http://mogya.com メールでメモがつけられる「いいめも」 http://ememo.jp/ 電源貸して!「モバイラーズオアシス」http://oasis.mogya.com/ -- ML: learn-ruby-in-kansai@r... 使い方: http://QuickML.com/
2328 2010-09-21 01:13 [y.arakawa@m... ] Re: [learn-ruby-in-kansai] メーリングリスト停止のご案内 2329 2010-09-21 01:55 ┗[ujihisa@g... ] 2330 2010-09-21 02:10 ┗[mogya@m... ] 2331 2010-09-21 03:00 ┗[ujihisa@g... ] -> 2332 2010-09-21 03:24 ┗[mogya@m... ]