トップページ⇒tech
995コメント369KB

Ruby 初心者スレッド Part 55

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2014/06/21(土) 23:39:44.94ID:rKd1VvW8
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ

前スレ
Ruby 初心者スレッド Part 54
http://peace.2ch.net/test/read.cgi/tech/1392598207/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/
0232デフォルトの名無しさん2014/08/03(日) 14:25:58.16ID:Uv66z7PH
>>231
ISO8601か。数字が続くと区切りにくいし、スペースはいろんなとこで区切り記号として使われているからじゃないか。スラッシュやハイフンも日時ではいろんな使われ方してるし。
0233デフォルトの名無しさん2014/08/03(日) 15:04:32.71ID:saA9+Ea3
>>231
プログラム的にわかりやすくてギリギリ可視性もあっていいじゃないか
ちなみにこれもエンドユーザーに直接表示することを目的とはしていない
これをそのまま見せようとするのではなく、自力でどうにかすること
0234デフォルトの名無しさん2014/08/03(日) 23:38:11.96ID:PzxowcJB
webサービスでユーザーネームとパスワードをユーザー側にcookieみたいな感じで保存させて自動ログイン機能を実装することはできませんか?

user = "ユーザー名"
password = "パスワード"
みたいな感じで、変数の値を保存させておき次回アクセスがあったらそれを代入させるイメージです。

本来はデータベースなりに保存するのでしょうがあくまでユーザー側に保存させるようにしたいです。
0235デフォルトの名無しさん2014/08/04(月) 01:09:54.00ID:VTkOlU1X
そういうのはセッションでやるんじゃないの
0236デフォルトの名無しさん2014/08/04(月) 03:21:57.60ID:tnMe/Qjc
>>234
できるけど、そんなサイト行きたくない。場合によっては悪質なサイトとして晒すレベル。
0237デフォルトの名無しさん2014/08/04(月) 03:40:50.26ID:Q/8i57D8
>>235
セッションでやってるんですけどうまく行かないんです。
有効期限も指定してて、firefoxからcookieも見れるのに何故かいつの間にかデータが読み込めなくなってるんですよ。
0238デフォルトの名無しさん2014/08/04(月) 03:44:49.65ID:Q/8i57D8
>>236
そこまでですか…

ちなみに理由はどうしてですか
ほとんどファイルサイズないしcookieは色んな所に保存されてるから大丈夫かと思ったんですけどセキュリティ的な問題ですか?
考えてみたんですけどこれくらいしか浮かばなかったのでよければ教えて欲しいです。
0239デフォルトの名無しさん2014/08/04(月) 03:46:00.08ID:hIaMhHwR
>>234
そのままやると問題が多すぎる。おそらく、期待としてはCookieStoreが近いと思う
0240デフォルトの名無しさん2014/08/04(月) 04:13:20.27ID:vzBGIwJJ
OAuth2.0
0241デフォルトの名無しさん2014/08/04(月) 04:48:08.48ID:tnMe/Qjc
>>238
セキュリティ上の問題。
それならHTTP digest認証使ったりブラウザに覚えさせた方がまだいい。
他の人が言っているのはセッションキーを使い捨てパスワードとして利用するのと同じ意味になる。
セッションジャックよりパスワードを盗まれる方が被害が大きい。
02422192014/08/04(月) 17:03:31.26ID:mXRA9UCQ
219です.
>>220, >>221, >>222, >>223, >>230 他皆さん
ありがとうございました.大変勉強になりました.

>>223 にある
Time.now.to_s.each_char.take(19).join # 先頭から19文字だけ取り出す

で対応することにしました.
0243デフォルトの名無しさん2014/08/04(月) 21:26:58.70ID:Q/8i57D8
Rack::Session::Cookieというものを見つけたのでこのページを参考にしながらこんな感じにやったのですがうまく行きませんでした。

http://d.hatena.ne.jp/shokai/20110324/1300999147

#Rack::Session::Cookie有効
use Rack::Session::Cookie,
:expire_after => 60*60*24*7,
:secret => '適当な文字列'

#代入するとき
session[:user] = 'username'

#読み出すとき
if defined?(session[:user])
user = session[:user]
end

ブラウザ終了がログイン状態が切れるきっかけというわけでもなく時間が立つと切れてます。
0244デフォルトの名無しさん2014/08/04(月) 21:42:32.94ID:6Tzsw3VW
>>242
ないわw
0245デフォルトの名無しさん2014/08/04(月) 23:57:26.06ID:XPxSUeR/
小学生から楽しむ Rubyプログラミング
http://www.amazon.co.jp/dp/B00LUKIEGG/
0246デフォルトの名無しさん2014/08/05(火) 00:27:04.52ID:Rp7Uk6zW
>>244
同意。あァァァんまりだァァアァ。
なんでprivateはあるのにsealedは導入しなかったruby。
0247デフォルトの名無しさん2014/08/05(火) 00:36:33.25ID:mOOeWZK0
>privateはあるのに
ないよ
よく調べろ
0248デフォルトの名無しさん2014/08/05(火) 01:03:45.06ID:52ECpDfa
小中学生にRuby教えて行ったらスレもこうなるっつうのはバカでもわかる
満足かね?
せめてRuby1年生は先生ごっこやめよ
0249デフォルトの名無しさん2014/08/05(火) 10:33:07.90ID:xop66pug
>>243
それで生のCookieの値はどうなってたの?
0250デフォルトの名無しさん2014/08/05(火) 16:52:55.87ID:n5rHoHG6
>>249
生のcookieの値というのはfirefoxの「prefenances」>「history」>「show cookie」からcookieを見た時にHostとかPathとかいくつか項目があるところのContentってところに書いてる値をそのまま書けばいいのでしょうか?


あと、他のサイトのcookieはどんな感じになってるのかと思い見てみたところHostという項目がない代わりにDomainがあるサイトがあります。
HostとDomainが両方ともあるというサイトは見かけなかったのですがこれらの違いは何なのでしょうか?

僕のサイトだとHostでした
0251デフォルトの名無しさん2014/08/05(火) 17:14:48.30ID:9+BWU5QF
>>250
Contentとは別に有効期限ってのがないかな?その値はどうなってるのか。
その値が正しければruby(rack)というよりブラウザ側の問題では?
ブラウザのcookie保存期間の設定は正しく設定されていないとか?
0252デフォルトの名無しさん2014/08/05(火) 18:13:26.87ID:n5rHoHG6
>>251
expiresの値は2014年09月04日 16時40分35秒になってます。
コードでも一ヶ月後に設定してたので多分有効期限の設定はうまく行ってると思います。

うまく行かない時もcookie自体は残っているので削除されてるって線は薄そうです。
とりあえず、firefoxでやってたので他のブラウザでも試してみます。
現状なんでうまく行かないのかもわからない状態なので…
0253デフォルトの名無しさん2014/08/05(火) 18:45:34.68ID:9+BWU5QF
>>252
あら、cookie残ってるのね。
他のブラウザでも同様であればコード側に原因があるかも。
>>243にある参考ページのサンプルコードがシンプルだから、
そのコードで動作確認してみては?
0254デフォルトの名無しさん2014/08/06(水) 04:13:53.68ID:/o/64fuk
use Rack::Session::Cookie,
:key => 'rack.session',
:domain => '.の後にdomain',
:path => '/',
:expire_after => 2592000,
:secret => '適当な文字列'

これでやったのですがうまく行きませんでした。
逆にうまく行く時はなんでうまく行くのかと思いキャッシュ消したりとかもやってみたんですが関係無いようでキャッシュを消してもcookieを読み込める時は読み込めて読み込めない時は読み込めないようです。

herokuで動かしてるのですがもしかしたらherokuの設定がうまく行ってないみたいな可能性とかはありませんか?
###### WARNING:
No Procfile detected, using the default web server (webrick)
警告出てたんですが問題なさそうだったので無視してましたし
config.ruにuse Rack::Session::Cookieを書いてるサイトもあったので僕の勝手な憶測ですが

現在のconfig.ruの中身
require './app'
run Sinatra::Application

原因自体つかめていない状態なのでそれを特定する方法の手がかりだけでも知りたいです
0255デフォルトの名無しさん2014/08/06(水) 04:17:39.98ID:/o/64fuk
警告は
この内容のProcfileを追加したら消えました。
web: bundle exec rackup config.ru -p $PORT
0256デフォルトの名無しさん2014/08/06(水) 07:07:48.40ID:9mmp63by
Firefoxにクッキーマネージャとか入れて確認してみるのがいいと思うな
0257デフォルトの名無しさん2014/08/06(水) 07:50:16.81ID:im7I2Tzq
> 原因自体つかめていない状態なのでそれを特定する方法の手がかりだけでも知りたいです

herokuとかの環境の情報は始めから出した方が良いと思うよ。
あとローカル開発環境では正しい動作だったのかとか。
問題の切り分けがしづらくて遠回りしてしまう。

herokuでは「use Rack::Session::Cookie」と
「enable :sessions」を同時につかうなみたいな記事あったけど
そのあたりは大丈夫?
0258デフォルトの名無しさん2014/08/06(水) 12:44:14.10ID:/o/64fuk
>>257
すいません。
環境等先に書いておくべきでした。

えーっと
ブラウザで動くsinatraアプリでweb apiをoauth認証をして使ってtumblr用のサイトを作っているのですがローカルだとあらかじめ入手しておいた自分用のアカウントのキーを定数でおいています。
なのでローカルだと連携アプリを許可するみたいなページを出してoauth認証させる部分を省いて開発しています。
oauth認証の過程がないのでcookieの処理もローカルのものには有りません。

herokuにあげたものがうまく動かないのはcookie周りの処理だけで他はoauth認証とcookieの処理がないローカル版と僕が見たところ同じ動きをしてると思います。

oauth認証の情報が保存されないだけでアカウントがどうこうということはないですけど、こんな状態なのでanalyticsで自分以外の人が来てないと確認しながらやっているのですがanalyticsが残すcookieはうまく動作してそうな感じです。

herokuは無料プランで、アドオンなどは入れていません。
enable :sessionsは大丈夫だと思います
0259デフォルトの名無しさん2014/08/06(水) 18:33:58.71ID:vbe86AaJ
>>258
読み込める時と読み込めない時があるようなので
oauth認証のタイムアウトとか考えられるけど
herokuはログにエラーは出すのかね。
02601732014/08/06(水) 22:43:28.11ID:9w14YIgy
>>180
>>188 では、ナゼ可視性(=protected や private の宣言)を使わない
スタイルを好む(個人的な)理由を書いた
その理由の中では:
> スーパクラス-サブクラス間でメソッドを介して関連し、なおかつ
> そのメソッドの外部からの利用を(protectedで)禁止するのが
> 望ましいというケースがほとんど無い(ちょっと思いつかない)
などと書いていたけど、それが間違いだったことに気付いた

ここ数日、標準ライブラリの Ripper.lex を使って、Ruby の
ソースコード解析ツールでの利用を想定した字句解析コードを書いていたのだけど、
試しに protected と private を使ってみたところ割とイイ感じになった
どうやら可視性に関しては、自分の食わず嫌いだったらしい....
  http://play.island.ac/codepaste/code?id=1583

他人から指摘されるまで気付かなかった自分が恥ずかしいけど、
まずは指摘してくれたことに対して礼を言う、ありがとん
02612112014/08/07(木) 00:41:38.32ID:QaqdPvt4
>>209-216
IO(入出力)クラスによると、
Windowsで改行、\r\nを読み込むと、
Rubyインタプリタ内で、\nに変換されて、
またWindowsに出力される時に、\r\nに変換される

つまりRuby内では、\nで統一されている
0262デフォルトの名無しさん2014/08/07(木) 01:54:36.56ID:UzLKIx83
¥r¥nが¥nで統一されてるとして
¥rはどして¥nに統一されてないのん?
0263デフォルトの名無しさん2014/08/07(木) 02:34:40.65ID:EqoC26iF
そもそもCRLFとLFの変換ってのは元はWindows(と言うかその前身のMS-DOS)の仕様だからなあ
Unixにはそんな仕様は無い

そして、DOSにそれをする必要があったのは自身の改行がCRLFで
C言語はUnix生まれのため改行がLFだったこと
これをMSは、オープン時にテキストモードかバイナリモードかを指定させ
テキストモードならCRLFとLFを変換する、とした

どちらもCRのみ(これは昔のMacの作法)とは関係がないので何もされない
0264デフォルトの名無しさん2014/08/07(木) 03:05:13.96ID:Os4j55OX
FTPにもテキストモードとバイナリーモードがあるしな
0265デフォルトの名無しさん2014/08/07(木) 04:51:50.32ID:mGC1aKkA
>>256
クッキーマネージャーはアドオン名でしょうか?
使いかたは自分で調べるのでどの項目や何を見ればいいのかがわからないので良ければ教えてくださいますか?

>>259
500番エラーが出てます
dashboardは投稿一覧みたいのを表示するページでこれは失敗した時のログです。
***は伏せ字です

2014-08-06T19:20:03.092865+00:00 heroku[router]: at=info method=GET path="/dashboard" host=*** request_id=62a8b28e-c1a0-4667-9127-988f2de7f579 fwd=*** dyno=web.1 connect=2ms service=181ms status=500 bytes=1235

うまく行ったときは200番がちゃんと帰ってきてます。


そこで、試しにoauthの情報を定数でおいているローカルの方のファイルをoauthの情報を書かずに実行すると似たようなエラーが帰ってきて
NoMethodError - undefined method `[]' for nil:NilClass:
となりました

heroku logsにも似たようなものが出てたのでやはりうまいことcookeから情報が読めてないのではという気がします
2014-08-06T19:20:03.077945+00:00 app[web.1]: NoMethodError - undefined method `[]' for nil:NilClass:

案の定クッキーはfirefoxから確認できたので何が理由かはわかりませんが何らかの理由で時間が経つとcookieから情報が読めなくなるみたいです。
0266デフォルトの名無しさん2014/08/07(木) 05:14:08.90ID:mGC1aKkA
あれ?
operaからも動作確認しようと思ってサイト開いたらどうもfirefoxとログインアカウントの情報が共有されてるみたいです。
firefoxからしかoauth認証(アカウントAで認証)してないのにoperaでも同じアカウント(アカウントAの情報)の情報で出てくる。
逆にoperaから別のアカウント(アカウントB)を認証してfirefoxで開いた時もfirefoxから許可してないのに別のアカウント(アカウントB)の情報で出てくる。

同一LAN上のタブレットから開いてもそうなりました。

意味がわからない…
0267デフォルトの名無しさん2014/08/07(木) 05:22:45.89ID:mGC1aKkA
>>266
すいません取り乱しました

そもそも、これがセッションの正しい挙動だったんですね。
sinatraがデフォルトでセッションをクッキーに保存しているというだけで別にセッションはクッキーを使うためのものではないって解釈でいいんですかね?
0268デフォルトの名無しさん2014/08/07(木) 11:27:41.97ID:qMfbyumE
>>265
cookieが読み込めないというより
500が帰ってきているから結果的にcookieが読み込めていないってことだよね。
firefoxでcookieが見れるというのは前回成功した時のcookieが見えているだけじゃないかな。
0269デフォルトの名無しさん2014/08/08(金) 00:35:31.80ID:fc9o1pZf
>>267
多分解決しました。
どうもクッキーの設定とsinatraのコードそのものの両方が間違ってたみたいでsinatraのコードダメ元で変えてみたら普段ならheroku にデプロイした後は確実にエラーが出るのですがちゃんと通り、半日ほど立ちましたがさっきもログインが持続していることを確認できました。

体系的な知識がなくかなり手こずりましたが皆様のおかげで解決出来ました。
0270デフォルトの名無しさん2014/08/09(土) 01:57:37.69ID:hZJQ1zja
セッション22
0271デフォルトの名無しさん2014/08/10(日) 00:10:35.94ID:Npb/3Qru
突然すみません

Selenium Webdriver、chromeにて
とあるサイトの画像URLを取得、テキストに追記で書き出ししようと色々と調べたのですが全く分からず困っています。


<div class="hoge">
<img src="http://hoge.jpg"; alt=""></div>

htmlは上記、xpathは/hoge/imgと仮定します


open("hoge.txt", "a"){|f|

output = driver.find_element(:xpath, '/hoge/img')

f.puts "#{output.text}"

}


のように書いてみたもののテキストに改行しか出力されない状態です
0272デフォルトの名無しさん2014/08/10(日) 00:30:45.65ID:zlJil821
それはどうでもいい
それを書く前に15個くらいスクリプトを作ったはずだ
それは動作したのかどうか言え

もしいきなりそれを作ろうとしたのならあらゆる点で間違っている
いきなり別荘を建てようとするな
まず釘打ってみたり床で組み立ててみたり本棚作ってみたり犬小屋作ってみたりしろ
その経験はひとつも無駄にならない
0273デフォルトの名無しさん2014/08/10(日) 01:14:37.49ID:Npb/3Qru
>>272
画面上にテキスト表示されている物はきちんと書き出されました
それで画像urlを取得しようと沢山調べ考えたんですが

今日はもう寝て先程見つけた下を参考にnokogiriにチャレンジしてみようかと
http://d.hatena.ne.jp/toyoshi/touch/20101109/1289294545

ちょっとnokogiri駆使してみたんですが上手く行かなかったような
0274,,・´∀`・,,)っ-○○○2014/08/10(日) 01:30:50.99ID:ObwJkVu+
>>272は名言だな 基本って大事ホント
0275デフォルトの名無しさん2014/08/10(日) 08:37:49.11ID:frgBbTF3
かーぺんた
0276デフォルトの名無しさん2014/08/10(日) 09:57:44.18ID:aTEKyeJh
http://www.buzzword.jp/img/face10.png
0277デフォルトの名無しさん2014/08/10(日) 11:18:40.68ID:TxwgTDO4
sublime text 3でruby使う上でやっとくべき設定やプラグイン教えて。
取り敢えずjapanize(メニュー日本語化)とConvertToUTF8(sjis文字化け対策)は入れました。
0278デフォルトの名無しさん2014/08/10(日) 15:06:43.67ID:zOHM5qWJ
>>277
やっとくべき設定?
まずその2つをアンインストールするんだ。
0279デフォルトの名無しさん2014/08/10(日) 17:01:06.03ID:DcfkR93x
>>277
エディタ固有の質問は専用スレあるんだから
そっちで聞いたほうがいい
0280デフォルトの名無しさん2014/08/12(火) 12:59:00.63ID:nam2SDUx
true, false が代入されている boolean 変数 flg に対して
printf で書式指定をするには何を使うのでしょうか?つまり,
printf( "%?", flg )
の ??? には何を指定するのでしょうか?
0281デフォルトの名無しさん2014/08/12(火) 13:24:35.57ID:ACV8I0vK
irb(main):001:0> format "%s", true
=> "true"
02822802014/08/12(火) 19:19:53.75ID:x7JUkwZI
>>281 できました。ありがとうございます。
0283デフォルトの名無しさん2014/08/12(火) 19:31:50.15ID:PU4N0EB0
Javaだとインタフェースとか抽象メソッドで「継承する時はこのメソッドを実装してね」って明示できるけど
Rubyでそう言う事したい場合ってドキュメントでカバーするの?
「ポリモーフィズムしたいからこのメソッドはもっとけ」みたいなの
0284,,・´∀`・,,)っ-○○○2014/08/12(火) 20:28:53.57ID:fcVldYYC
そういうお堅い言語じゃない。
実行中にメソッド追加したり削除したりできるくらいだから当然
言語レベルとしてはない。

だがやれんこともない。
http://qiita.com/akisute3@github/items/66bf766166eda2b84a03

Rails的にはテストコードでカバーかね
メソッドが定義されているかはdefined?で確認することができる。
0285デフォルトの名無しさん2014/08/12(火) 22:29:22.75ID:NtdaG8qe
>>283
上書きしないと例外投げるだけのメソッド作っとく。
0286デフォルトの名無しさん2014/08/12(火) 23:31:37.25ID:kLOI0Uws
>「継承する時はこのメソッドを実装してね」
その考え方がキモい、ということにはなってる

いや常識的に考えて○○ができなきゃオブジェクト指向じゃないだろ、というものの大半は
単に特定の言語、ぶっちゃけJavaとC++、のローカル仕様だったりする
RubyでJavaをやるのはやめようぜ、Rubyなんだし
0287デフォルトの名無しさん2014/08/12(火) 23:41:51.41ID:x9ZUxVMu
動的言語なんだから実行時にエラー出しときゃいいんだよ。
0288デフォルトの名無しさん2014/08/12(火) 23:51:26.48ID:okDd+6G6
その考え方はもう古い
スクリプトといえども型名等明示できるものは明示できるようにして
ヒューマンエラーを未然に防げるようにしておくのがトレンド
というわけでRuby3はその方向に進化してくれ
0289デフォルトの名無しさん2014/08/13(水) 00:23:51.87ID:KN2EsXN5
>>286
残念だけど、「その考え方」は Smalltalk の時代から「よくある言い方」、
いわゆる「イディオム」の一つとして普通に存在している
ちなみに Smalltalk では、>>285 の表現を借りると:

 上書きしないと subclassResponsibility メッセージを
 投げるだけのメソッド作っとく。

になり、これを Ruby で言い直せば:

 上書きしないと例外 SubclassResponsibility を
 発生させる(raise する)だけのメソッド作っとく。

になる

さて >>286 に限らず、C++/Java のような静的OOPしか知らない人が
「OO設計の概念は C++/Java から生まれた」みたいな
硬直した発想をしがちなのはナゼなんだろうか?
0290デフォルトの名無しさん2014/08/13(水) 01:06:25.32ID:OCtuWZt1
いろんなスレで無理やりSmalltalkの話題切り出すのやめてくれ
まじでうっとおしい
0291デフォルトの名無しさん2014/08/13(水) 01:09:46.40ID:lr+rlGxM
>>289
被害妄想じゃない?
286のレスからはそうは読み取れないな
硬直した発想だとか言うけど
起源主張して褒められたいという発想自体が
まさにソレじゃね
0292デフォルトの名無しさん2014/08/13(水) 01:11:07.57ID:TCL9mbxJ
>>289
僕が初めてオブジェクト志向言語を触ったのはjava/c++だったから! って人が多いから。
Ruby なら、そういう用途に使うために NotImplementedError が組み込みであるから、それを使ってくれというのが言語としてのスタンスってだけの話だと思う。
0293デフォルトの名無しさん2014/08/13(水) 01:16:16.87ID:0XAF0Eso
どんな言語だろうと自分の開発手法に足りないものがあったら、実現手段を考えるだけ。
0294,,・´∀`・,,)っ-○○○2014/08/13(水) 01:34:10.05ID:K9qjufdc
method_missing + eval
02952892014/08/13(水) 02:31:29.89ID:KN2EsXN5
>>288,293
「無いのなら作ってしまえホトトギス」ということで、
属性の宣言 attr_reader 等と似た抽象メソッド宣言 abstract_method を書いてみた

 http://play.island.ac/codepaste/code?id=1586

abstract_method の使い方は:
・attr_reader 等と同様に、クラス定義内で abstract_method を呼ぶ
・引数は、メソッド名をキー、メソッド引数の個数を値とするハッシュを渡す
・例:abstract_method :foo => 1 # 抽象メソッド foo を宣言


>>290
わざわざ動的OOP言語である Ruby スレで C++/Java との話題を切り出す、
しかも無知に起因すると思われる間違った情報(>>286)をまき散らすのも勘弁願いたい
02962892014/08/13(水) 02:43:24.62ID:KN2EsXN5
>>295 のコードについて、94行目から間違いがあったので訂正

・訂正前
 94 # 具象メソッド
 95 def foo(message)
 96   format "I am a %s.", self.class
 97 end

・訂正後
 94 # 具象メソッドを利用するメソッド
 95 def foo(message)
 96   format "I am a %s.", message
 97 end

訂正した結果として、実行例も "I am a FOO." になる
02972892014/08/13(水) 03:01:19.57ID:KN2EsXN5
>>291
抽象クラス/抽象メソッドという概念を使いたくない、という
主張だけなら、特に気にしなかった
個人のプログラミングスタイルなんだから他人がとやかく言うべきじゃないし、
Ruby はそういった(良い意味で「お気楽な」)スタイルも許容する認める言語だから

でも >>286 は自分の主張を周囲に押しつけようとし、
しかもその主張の根拠「JavaとC++、のローカル仕様」が間違っているから
厳しい口調になった

言いたかったのは、それだけだ
0298デフォルトの名無しさん2014/08/13(水) 04:30:45.53ID:lr+rlGxM
>>297
面白いなw
> 自分の主張を周囲に押しつけようとし
ってのがまさに
> 「継承する時はこのメソッドを実装してね」
これじゃないか。
普通に読み取れば
言語ごとに色が有るんだから
多様性を楽しもうぜってのが286のレスでしょ。
どう読み取ればそうなるんだよ
0299,,・´∀`・,,)っ-○○○2014/08/13(水) 07:57:49.27ID:K9qjufdc
大ヒント

class Parent
 def self.inherited(child)
  child.class_eval do
    # ここでなんか処理
  end
 end
end

C++やJavaで純粋仮想関数使いたい意図はわかるが
「ヒャッハー!コンパイル通さないぜ!」やるだけでOO設計やった
気になるのはいかがなものかと。

  return 0;

やるだけの関数定義してもシンボル名さえあってれば通っちゃうわけだよね。
お前それでいいのか?
03002892014/08/13(水) 11:44:01.65ID:KN2EsXN5
>>286 の真意はカキコした本人にしか分からないから横に置くとしても、
たしかに面白いな

・Enumerable モジュールを include する時はメソッド each を実装してね
・Comparable モジュールを include する時はメソッド <=> を実装してね
・あるクラスをハッシュのキーとして扱う時はメソッド eql? と hash を実装してね
・AcriveRecord::Base を継承する時は、DB上に同名のテーブルを定義し、
 type というカラムを設けてね

Ruby プログラミングではありふれた決まり事のいくつかだけど、
これらも >>298 には「おしつけ」になるんだろうなぁ.....
うん、たしかに面白い
0301デフォルトの名無しさん2014/08/13(水) 13:03:40.66ID:XU9wPxJn
>>280
flg=true;flg.to_s
0302デフォルトの名無しさん2014/08/13(水) 13:33:34.15ID:TBkS3gli
foo:true ←よい
foo:1 ←よい
foo:'bar' ←よい

foo: :bar ←なんかださい
0303デフォルトの名無しさん2014/08/13(水) 14:47:53.87ID:s6AcBQ2c
library yamlについて質問です。
YAML.dumpで書き出したときに先頭がマルチバイト文字
だと自動的に""で囲まれるようですがこれは確定した仕様なんでしょうか?
ドキュメントに一切記述がなくて不安です。
0304デフォルトの名無しさん2014/08/13(水) 15:06:48.24ID:KN2EsXN5
>>303
この話かな?

・Ruby1.9.2で日本語を含むYAMLを出力する時、バイナリ文字列化されないようにする
 http://keijinsonyaban.blogspot.jp/2010/10/ruby192yaml.html
03052802014/08/13(水) 15:38:20.34ID:hIUx5GQv
>>301 さんくす。
03063032014/08/13(水) 16:32:59.37ID:s6AcBQ2c
>>304
そんな感じです。こちらの環境はwindows版2.0でPsychも有効になっているようですが
require 'yaml'
jp = 'あいうえお'
puts(YAML.dump(jp))
#--- "あいうえお"
en = 'abcde'
puts(YAML.dump(en))
#--- abcde
#...
となって日本語のほうだけダブルクォーテーションで囲まれてしまいます。
確定した仕様なら大した問題はないのですがいろいろ調べてると2,3年混乱
が続いたライブラリのようで不安になってきました。使わないほうがいいのでしょうか?
0307デフォルトの名無しさん2014/08/13(水) 16:45:24.76ID:9nXT2NBI
君子危うきに近寄らず
03082892014/08/13(水) 21:39:49.42ID:KN2EsXN5
>>295-296 の抽象メソッド宣言コードについて、これの具体的な
使用例として「2次元クラフィック向けの四角形クラス」を書いてみた

 http://play.island.ac/codepaste/code?id=1587

これは姉妹スレ「Rubyについて Part49」の #771,772-774 で書いていた
コードを改造母体にして、抽象メソッド宣言やその他の変更を加えたものです
参考まで
03092892014/08/13(水) 22:40:38.72ID:KN2EsXN5
Ruby における抽象クラス/抽象メソッドの話題はググるといくつか見つかる
今さら調べてみると、海外でも似たような議論をしている

・Abstract Method in Ruby - Stack Overflow
 http://stackoverflow.com/questions/6792428/abstract-method-in-ruby

 ここでも基本は「具象クラスで抽象メソッドが未定義であれば例外を投げる」だけど、
 >>289 と同様に Smalltalk ではそれを SubclassResponsibility と呼ぶという
 レスが付き、それと類似のコードが提案されている

また、>>295 では抽象メソッド宣言コードを自作してみたけど、
同じ事を考えていた人は海外にもいた

・Creating an Abstract Method | zenspider.com
 http://www.zenspider.com/Languages/Ruby/Cookbook/ClassesAndObjects/AbstractMethod.html

 >>295 では組込みクラス Module に宣言メソッドを追加していたけど、
 こちらの実装では宣言クラス Abstract を定義しクラスメソッド Abstract.method として
 抽象メソッドを宣言する API 仕様になっているみたいだ
 例えば、任意のクラス定義内で Abstract.method :foo と書く
0310デフォルトの名無しさん2014/08/13(水) 22:54:28.35ID:KN2EsXN5
>>306
YAML は使ったことがないのでよく分からんけど、
公式仕様書では最初のドラフト版である 1.0 の時点で
ダブルクォーテーションで囲まれた文字列が定義され、
最新版の 1.2 でも仕様定義に変更はなく安定しているみたいだね
・YAML&#xA0;Ain’t&#xA0;Markup&#xA0;Language&#xA0;(YAML) Version&#xA0;1.2
 http://yaml.org/spec/1.2/spec.html#id2760844
 この仕様書の例 "Example 2.17. Quoted Scalars" が該当する箇所

後はライブラリにおける仕様の実装品質を検討することになる
・もし品質が保証された他の手段(他のYAML実装やJSON/XML仕様)が
 存在しているなら採用を検討する、あるいは
・とりあえず何か問題が起こるまでは標準ライブラリの利用を継続する

ぶっちゃけた話、どちらを選ぶのが適切かはケースバイケースだから、
後は >>306 自ら最終判断を下すしかないと思う
0311デフォルトの名無しさん2014/08/14(木) 03:58:05.93ID:+2zwhmMM
馬鹿には無理
0312デフォルトの名無しさん2014/08/14(木) 07:51:44.38ID:/Ffu3gb/
ふぇぇ・・・
0313デフォルトの名無しさん2014/08/15(金) 04:49:13.30ID:MB8edIwX
URI.parse('file://foo.txt').open
ってできなくて不便なんすけど
ruby2.1でもまだfileに対応してないんスね
0314デフォルトの名無しさん2014/08/15(金) 05:36:59.12ID:5MJoVvaB
>> "a\nb\nc\n".split("\n")
=> ["a", "b", "c"]
>> "a\nb\nc\n".split("\n"){|i| puts i}
=> ["a", "b", "c"]
>> "a\nb\nc\n".split("\n").each{|i| puts i}
a
b
c
=> ["a", "b", "c"]
>>

2行目のeachつけ忘れでエラーでないんだけど
Arrayに直接ブロックをぶら下げると何が起こるの?
0315デフォルトの名無しさん2014/08/15(金) 06:18:06.78ID:11xv4jXV
その二番目の例で split は渡されたブロックを処理せずに単に捨ててる
0316デフォルトの名無しさん2014/08/15(金) 08:26:41.72ID:2ipN4K8/
「ブロック処理は定義されていませんエラー」というのはRubyのデフォルトにはない
irb> 'abc'.upcase
=> "ABC"
irb> 'abc'.upcase{|x| foo}
=> "ABC"
0317デフォルトの名無しさん2014/08/16(土) 18:49:31.04ID:ur+z2lZs
Programming Ruby 1.9&2.0 の翻訳本は出ないのかな?
原書は2013年5月に出版されたようだけど。
0318デフォルトの名無しさん2014/08/16(土) 19:08:17.04ID:pCqm9jUF
Programming Ruby 2.1 が出版されてから
翻訳を検討し始めるのではないかと思われ

Ruby 2.2 リリースとの熾烈な競争になるなぁ(棒
0319デフォルトの名無しさん2014/08/16(土) 19:14:06.94ID:jGqbtnFx
翻訳版といら要らんよね
0320デフォルトの名無しさん2014/08/16(土) 21:15:40.19ID:jGqbtnFx
if foo = 1 || foo == 2 || foo == 3
 bar
end
をもちっとコンパクトに書けんかの

if [1, 2, 3].include?(foo)
 bar
end
だとなんかイモい

case foo
when 1, 2, 3
 bar
end
もなんかイモい

if foo is 1 || 2 || 3
 bar
end
とかかけたらな
0321デフォルトの名無しさん2014/08/16(土) 21:43:07.02ID:pCqm9jUF
>>320
コードの可読性が数学における表記法との類似性を指すのであれば:
>> if [1, 2, 3].include?(foo)
が最も類似していると思う

もしコンパクトさを最重要視したいのなら、
Ruby では識別子に UTF-8 文字が利用できるから、
以下のコードを書けばいい

irb(main):001:0> module Enumerable; alias ∈ include?; end
=> nil
irb(main):002:0> [1, 2, 3].∈ 2
=> true
irb(main):003:0> [1, 2, 3].∈ 4
=> false
irb(main):004:0>
(2ch では「∈」という文字が化けている可能性が高いけど、
 これは「ある要素が集合に含まれているか」を表す数学の記号)
0322デフォルトの名無しさん2014/08/16(土) 21:51:29.58ID:A0O6xtGz
>> if [1, 2, 3].include?(foo)
はRuby的ではないだろ
論理的に合っててシンプルならいいってのはPythonっぽいわ
0323デフォルトの名無しさん2014/08/16(土) 22:06:29.30ID:pCqm9jUF
>>322
>>321 では「数学的表記との類似性」という視点でコードを示したわけで、
これが「Ruby的」とは一言も書いていない
だから一体、何に対して過敏に反応しているのか、わけがわからんな

「Ruby的」とか「Rubyっぽい」というのは、>>320 の前半3つの書き方、
そのどれでも受け入れ、その中からどれを選択するかはプログラマに
任せるという「寛容な設計哲学」にある(と、個人的には考える)

これの「Rubyらしさ」は、常にプログラマへ「論理的に合っててシンプルならいい」を
強要する Python とは対照的だね
0324デフォルトの名無しさん2014/08/16(土) 22:09:16.80ID:xeQ2qkm2
fall throughが欲しいなぁと思うことがある
0325デフォルトの名無しさん2014/08/16(土) 22:13:46.44ID:ur+z2lZs
>>323
もっとコードをしっかり読もうよ。
元のコードの一行目はなんか変じゃない?
0326デフォルトの名無しさん2014/08/16(土) 22:17:39.81ID:pCqm9jUF
>>325
typo をいちいち揚げ足取りするほど野暮じゃないんで....
0327デフォルトの名無しさん2014/08/16(土) 22:23:52.88ID:ur+z2lZs
if foo<4
bar
end
foo∈Nなら
0328デフォルトの名無しさん2014/08/16(土) 23:21:02.64ID:xeQ2qkm2
>>322
pythonだねw
0329デフォルトの名無しさん2014/08/17(日) 11:50:17.42ID:C1vhwMQl
こういう書き方ができないわけでもない。推奨はしないが。
class Fixnum
 def is(f)
  f.call(self)
 end
end
def one_of(*them)
 return them.first.method(:include?) if them.size == 1
 them.method(:include?)
end

foo = 5
bar if foo.is one_of 1,3,5,7
bar if foo.is one_of [1,3,5,7]
bar if foo.is one_of 1..7
0330デフォルトの名無しさん2014/08/17(日) 16:28:19.29ID:v7smLqH2
http://guides.rubyonrails.org/active_support_core_extensions.html#in-questionmark
0331デフォルトの名無しさん2014/08/17(日) 18:27:16.73ID:F9qolS48
ユーザーのソースコードスキャンして
100人が同じような実装書いたら自動でオリジナルに反映されるクラウド型言語にすれば
車輪の再開発も最小限に抑えられるのに
■ このスレッドは過去ログ倉庫に格納されています