トップページ⇒tech
1002コメント364KB

Ruby 初心者スレッド Part 58 [無断転載禁止]©5ch.io

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

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

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0765デフォルトの名無しさん2016/08/31(水) 14:06:39.13ID:LUuLSP6C
逆ポーランド記法は文脈的に全くの別のものじゃん
0766デフォルトの名無しさん2016/08/31(水) 14:31:38.27ID:PJmqkaeb
多分言いたいのはシステムハンガリアンなんだろうな
0767デフォルトの名無しさん2016/08/31(水) 23:21:21.50ID:VrI1x3gR
ジャンガリアンじゃね?
0768デフォルトの名無しさん2016/09/01(木) 00:42:21.07ID:4EaPp0tJ
いただきが名前をいただきした
0769デフォルトの名無しさん2016/09/01(木) 02:23:39.56ID:u/ZMrN1Z
ruby始めて4日目くらいなんだが、リファレンス見るとメソッドの引数名が*pathとかあるんだが、*になんか意味あるんですか?
0770デフォルトの名無しさん2016/09/01(木) 03:11:44.86ID:Bl3p1IFz
>>769
可能ならリファレンスの文法の項目は全部読んだ方が良いよ

>仮引数の直前に * がある場合には残りの実引数 (後述の post 引数を除く) はみな配列とし てこの引数に格納されます。 可変長引数、rest 引数などと呼ばれる機能です。 このような引数は 1 つしか作れません。
ttp://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fdef.html
0771デフォルトの名無しさん2016/09/01(木) 15:14:09.12ID:GAgoRnb9
Windows + ruby2.3 で使えるサーバ不要のデータベースgemってどんなのがあるんでしょうか
0772デフォルトの名無しさん2016/09/01(木) 16:41:53.55ID:lxKZC7pd
>>771
gem install sqlite3-ruby
07737712016/09/01(木) 17:23:18.43ID:dI9CGFDX
>>772
windowsの2.3対応はまだじゃないですか?
githubの最新版だと対応してるっぽいんですが、導入の仕方がよくわかんないです
0774デフォルトの名無しさん2016/09/01(木) 17:30:15.13ID:u2weFoMG
>>771
単にデータを保存したいだけならPStoreやMarshalでgem使う必要が無い
0775デフォルトの名無しさん2016/09/01(木) 17:35:10.99ID:lxKZC7pd
>>773
ごめん、使えるんじゃないかなーレベルで書いてしまった
0776デフォルトの名無しさん2016/09/01(木) 19:34:04.12ID:UWb4BubA
つか自分が「こうしたいな」という要件があって、
それを元にメソッドを調べるときってまず何を見る訳?
0777デフォルトの名無しさん2016/09/01(木) 20:19:22.98ID:Xz8sejsg
上のSQLiteみたいな要素技術の名前とだいたいそれがどんなものかくらいはある程度知ってて当然
ローカルのDBが欲しいな→SQLiteがあったな→ruby sqliteでググろう
となる
0778デフォルトの名無しさん2016/09/01(木) 20:48:24.77ID:4EaPp0tJ
>>776
逆引き
0779デフォルトの名無しさん2016/09/01(木) 20:50:54.60ID:Uog0CqGC
>>776
どんなメソッドがあるかぐらいは一通りさらっと見て脳内でインデックスを作っておく
細かい使い方まで覚える必要はない。そんなのは後で調べればいい
0780デフォルトの名無しさん2016/09/01(木) 23:24:31.38ID:u2weFoMG
とりあえず
ttp://docs.ruby-lang.org/ja/2.3.0/library/_builtin.html
ttp://docs.ruby-lang.org/ja/2.3.0/library/index.html
の一覧を見て、大体何があるかを把握しておく
Array Hash String Enumerable あたりはメソッドも一応目を通しておく
0781デフォルトの名無しさん2016/09/03(土) 02:48:37.27ID:uJ1wm+Vm
>>770
ありがとうございます読み込んでおきます
0782デフォルトの名無しさん2016/09/03(土) 08:05:24.94ID:wEDYvGbd
splitが末尾の空白業とかを勝手に削っちゃうんですがどうすればいいですか

p "aaa
bbb
ccc

".split("\n")

["aaa", "bbb", "ccc"]
# 望む結果: ["aaa", "bbb", "ccc", "", ""]

"...".scan(/(.*(?:\n|$))/).flatten.map{|i| if i == "" then i else i.chomp end}
だと一応出来たんですが無様すぎる…
0783デフォルトの名無しさん2016/09/03(土) 08:15:03.42ID:yBtBzV43
Rubyをこれから学ぼうと考えているものです。
最近、GitやVagrant、ChefなどWeb関係で
必須ともいえるアプリケーションがありますが、
それらはRubyで書かれております。

何故、Rubyがこれらに採用されているのでしょうか。
以前、言語間の性能比較したもので、
処理速度に関しては、PHPの方が処理速度が速いとありました。
にもかかわらず、Rubyが採用されているのか気になったのですが、
どうしてでしょうか?
0784デフォルトの名無しさん2016/09/03(土) 08:36:23.97ID:Hj3S1o7Z
>>782
str.split($/,-1)

長くもないんだからString#splitのマニュアルくらい読むと良いよ
ttp://docs.ruby-lang.org/ja/2.3.0/method/String/i/split.html
0785デフォルトの名無しさん2016/09/03(土) 09:54:12.22ID:AtgdG5E3
>>783
探したけど、ちゃんと理由を話してくれる記事見つからないな。
個人的な回答だけど参考に

Ruby DSL でぐぐるとわかると思うが、
Rubyの文法で設定ファイルを作ってもプログラムコードっぽく無いようにかけるんだよね。
だからユーザはコード詳しくなくても内容読める。アプリの開発者はRubyだから設定ファイルの解析の必要もない。

あと、VagrantfileもChefの設定ファイルもあれ、素のRubyの文法にしたがってるから
拡張がしやすいとかRubyが採用された理由なのかも

こんな風にかけたりね。
Ruby初学者はちんぷんかんぷんだけどw
%w{vim unzip git mlocate lsof wget}.each do |pkg|
package pkg do
action :install
end
end
0786デフォルトの名無しさん2016/09/03(土) 13:18:38.92ID:G3gUtM0z
>>783
処理速度だけが選択基準ならみんなCを選ぶよ
選択基準は開発者のそれぞれだからね
開発速度とかメンテのしやすさとか好き嫌いとか
0787デフォルトの名無しさん2016/09/03(土) 13:49:20.66ID:RiDSsLxh
ツール・DSLの作りやすさでは、Ruby, Groovy。
設定ファイルを書く際、プログラミング言語っぽくなくて読みやすい。
さらに手続きも書ける

SASS もRubyだろ。
Gradle は、Groovy
0788デフォルトの名無しさん2016/09/03(土) 16:56:47.72ID:w8mOGCX1
perlがいやでrubyに手を出してみたらperlそっくりだったでござる
0789デフォルトの名無しさん2016/09/03(土) 17:03:34.98ID:vCC0oq7q
>>783
一言でいうと、Rubyは遅いけど書きやすいから
0790デフォルトの名無しさん2016/09/03(土) 17:04:16.68ID:vCC0oq7q
>>788
後継だから似てるだろうけど
PerlよりかはRubyの方が
読み書きしやすいと思う
0791デフォルトの名無しさん2016/09/03(土) 18:05:32.81ID:0ZHQPGtd
でもperlっぽい書き方してる人いまだにいるよな
0792デフォルトの名無しさん2016/09/04(日) 09:39:54.24ID:pVjNdAS+
>>783
スクリプト言語の速度なんか目糞鼻糞。
(JavaScriptやLuaあたりだけは別格だけど)
多くのスクリプト言語の用途においてボトルネックになるのは言語の処理速度ではなくIO(ネットワーク、DB、ファイル)。
IOはとんでもなく重い処理なので、
スクリプト言語の実行速度の差なんか誤差レベルで全く無視できる。
あとはちょっとしたツールやバッチだと仮に0.01秒が0.1秒に伸びたところで問題にならないケースも多い。
0793デフォルトの名無しさん2016/09/04(日) 12:31:44.31ID:C66L8/dk
ツール・DSLの作りやすさでは、Ruby, Groovy だから、最初はこれらでCUIアプリが作られる。
その後、GUIが作られる

次にPythonなどで、類似のフレームワークが作られる。
大規模なサイトでは、速度向上するため、Goなどで作られる

だから、Ruby, Groovy には、文系のアイデアマンが多い。
試行錯誤する実験的な人達が集まる

一方、Pythonでは、理系の数学領域の人が多い
0794デフォルトの名無しさん2016/09/05(月) 02:22:06.60ID:SdDvLzP6
ファイル操作をしていて、ファイル名によって(?)期待していない挙動になったので質問させてください。

Windows 10
ruby 2.3.1p112 (2016-04-26 revision 54768) [i386-mingw32]

http://fast-uploader.com/file/7028564377998/

Rubyで書いたのは、引数で渡されたファイル名の末尾に
0795デフォルトの名無しさん2016/09/05(月) 02:24:10.75ID:SdDvLzP6
"_"を足して別ファイル作成する、というもの。
これをテストするために"test.bat"を作って、

> test.bat *.txt

という感じでテストしました。

foo(bar).txt
foo(bar)[hoge-huga_fizz].txt

というファイルに対しては、

foo(bar)_.txt
foo(bar)[hoge-huga_fizz]_.txt

となることを期待しましたが

foo(bar)_.txt
foo(bar)__.txt

となります。

色々試したところ、"_"を"a"に変えたり、ファイル名を変更すると期待した挙動になります。
アンダースコアはファイル名的に特別だったりしますか。
ハマりまくっているので助けてください…
0796デフォルトの名無しさん2016/09/05(月) 02:31:07.88ID:B0VMf5p9
詳細不明なzipファイルなんてみる人少ないと思うよ
codepadなんかで投稿しなおしてみては
07977942016/09/05(月) 02:42:18.42ID:SdDvLzP6
投稿しました。試験用のファイル含めて計4つ分です。
http://codepad.org/phgMbtNs
0798デフォルトの名無しさん2016/09/05(月) 03:00:37.69ID:vxYcnkVP
これオリジナルのスクリプトなんだろうか
投稿のために短く切り詰めたとかじゃなく
そりゃ大変だ
教科書投げ捨てる案件だなコレ
0799デフォルトの名無しさん2016/09/05(月) 03:17:25.42ID:B0VMf5p9
新しく作ったファイルは空だけどいいのか?
まあともかくdst_filenameには想定通りの文字列が来てるみたいだから、batファイルの問題なんじゃないか
windowsのことはわからん
0800デフォルトの名無しさん2016/09/05(月) 04:09:04.01ID:DasxJQQ9
for %%f in ("%*") do (
echo %%f
ruby test.rb %%f
)
こうじゃない?
bat 使わずに ruby だけでやった方が楽だと思うけど。
0801デフォルトの名無しさん2016/09/06(火) 00:57:19.17ID:JK1a3Uc+
bat はバグるからアカン

せめて、PowerShell_ISE だろ
0802デフォルトの名無しさん2016/09/06(火) 17:01:21.99ID:XKZPS+fP
batを使うのはbadだぜ
08037942016/09/06(火) 22:28:35.50ID:yRSBEbJd
ファイル名を受け取っているだけのRuby側は問題無さそうということで
ありがとうございました。
0804デフォルトの名無しさん2016/09/07(水) 06:36:39.93ID:apKIFhKK
TAIL = '_'
exit if ARGV.empty? || !File.exist?(ARGV[0])
src_filename = ARGV[0]
begin
  dst_filename = src.filename.sub(/.\K(\.)(?=[^.]+$)|$/,TAIL+'\1')
end while File.exist?(dst_filename)

p dst_filename
0805デフォルトの名無しさん2016/09/07(水) 10:51:39.61ID:dMgwZegp
ruby 2.3.1

rubyをconfigureかmakeまでしたら
make distcleanやっても消えないファイルがあるんですが仕様ですか?
この状態でconfigure && makeすると
executable host ruby is required. use --with-baseruby option.
なって途中で止まっちゃうんです。何でですか?
0806デフォルトの名無しさん2016/09/07(水) 11:43:57.58ID:mGf42UhL
>executable host ruby is required. use --with-baseruby option.
をそのまま訳すなら「動かせるrubyが必要だから--with-baserubyオプション使えよ」って事になる
ぐぐったら色々出てくるけど、ソースからコンパイルしてインストールしようとしてるの?
情報不足だからこれ以上はわからない

インスコするならrbenvとかRPM使ったほうが楽に入れられると思う
0807デフォルトの名無しさん2016/09/07(水) 12:03:10.18ID:YSZpbVen
>>794-795 >>797 >>803
おまいが悪い
ruby 側の問題

ループ中でファイルが増えてるので
同じファイルにアクセスし続けてる

ファイル一覧を一旦リストに入れてから処理すれば成功するだろう
0808デフォルトの名無しさん2016/09/07(水) 12:05:38.78ID:YSZpbVen
windowsの場合だけ問題が起こるなら
原因はディレクトリのソート順かもしれんな
いずれにしてもループの要素をループ中で増減するのは危険
0809デフォルトの名無しさん2016/09/07(水) 21:57:51.62ID:tAhMeQ6s
rubyはじめるわ!
0810デフォルトの名無しさん2016/09/08(木) 00:34:49.37ID:zamWLbBn
>>794-808
a_.txt ファイルが作られた後、それがbatのループに拾われて、
a__.txt ファイルが作られるとか?

別のディレクトリに、ファイルを作るとか、
ループ終了後に、まとめてファイルを作るなど、排他的に処理すべき

>>805
>make distcleanやっても、消えないファイルがあるんですが、仕様ですか?
makefileの、distcleanの所を見れば?
0811デフォルトの名無しさん2016/09/08(木) 09:23:30.37ID:gPBbc6Mn
batファイルの引数以外のファイルは拾われないでしょ
別に問題ない
0812デフォルトの名無しさん2016/09/08(木) 17:03:47.71ID:vq3pb7wp
質問させてください
以下のようなJSONファイルをJSON.parseしてhogeに格納しました
[ { "id":"1","kana":"あ","boin":"a" } ]
この状態で「p hoge.class」するとArryを返されます

JSONファイルをこうすると
{ "id":"1","kana":"あ","boin":"a" }
Hashを返されます

[{…},{…},{…}]のJSONファイルをHashに格納したいのですが
なにか良い方法はありませんでしょうか
よろしくお願いします!
0813デフォルトの名無しさん2016/09/08(木) 18:11:48.06ID:uHWEQ8CC
>>812
[ { "id":"1","kana":"あ" }, { "id":"2","kana":"い" }, { "id":"3","kana":"う" } ]
がどう変換されたいのか書いてみて。
0814デフォルトの名無しさん2016/09/08(木) 20:24:23.21ID:gPBbc6Mn
hash1, hash2, hash3 = [{・・・}, {・・・}, {・・・}]
0815デフォルトの名無しさん2016/09/08(木) 21:19:39.88ID:5PY6byd9
ひとつのdictには一組しかないケースじゃないん?たぶん
hoge.inject({}) {|result, item| result.merge(item) }
hoge.inject({}, &:merge) # 省略形
0816デフォルトの名無しさん2016/09/08(木) 21:29:09.66ID:s09Hu+LE
injectにProc渡せるようになったの?
0817デフォルトの名無しさん2016/09/08(木) 22:09:36.89ID:gPBbc6Mn
[*1..9].reduce(&proc{|a,b|a+b}) #=> 45
[*1..9].reduce(&lambda{|a,b|a+b}) #=> 45
少なくとも1.8.7の頃からできるよ
0818デフォルトの名無しさん2016/09/08(木) 22:21:38.10ID:s09Hu+LE
Symbolじゃないとダメだと思い込んでた
inject/reduceは意図的に両方OKな設計にされてるのね
0819デフォルトの名無しさん2016/09/09(金) 04:17:17.09ID:LpeB3e0i
複数のハッシュ群を、Arrayにいれておいて、取り出して使えば、いいだけ

ary = [ { "id":"1","kana":"あ" }, { "id":"2","kana":"い" }, { "id":"3","kana":"う" } ]

h = ary[1]
p h
{:id=>"2", :kana=>"い"}
0820デフォルトの名無しさん2016/09/09(金) 07:40:28.22ID:Lk44lMhw
>>794
bat でやりたいことは、コマンドライン引数のワイルドカード展開なんだろうけど、
# test.rb
p ARGV
---
test.rb *.txt
って、やってごらん。

マニュアルに書かれているようにワイルドカード展開に `*', `?', `[]', `**/' が使える。
Windows環境で []等を含めたければ ''括る、とも書いてあるね。
0821デフォルトの名無しさん2016/09/09(金) 13:22:13.98ID:nAt2a2k9
>>814
そのままやればいいんじゃないの?
hash1, hash2, hash3 = JSON.parse(json_string)
0822デフォルトの名無しさん2016/09/10(土) 11:26:54.07ID:0WfpQ0VB
>ruby -e " p false && echo;p :end"
false
:end
>ruby -e ' p false && echo;p :end'
false
p :end'

Windowsで'-e'に対してシングルクォート(')でスクリプトを書くと
'|' や '&' や '&&' がコマンドプロンプトのコマンドとして認識されてしまうんですがおま環ですかね?
ruby 2.3.1p112 (2016-04-26 revision 54768) [x64-mingw32]
Windows8.1(x64)
0823デフォルトの名無しさん2016/09/10(土) 11:36:17.02ID:0WfpQ0VB
あ、なんかすごくアホな質問してました
無視してくださいorz
0824デフォルトの名無しさん2016/09/10(土) 13:37:43.64ID:QUVRyXDh
なんかムラムラするなお前
0825デフォルトの名無しさん2016/09/11(日) 16:04:49.34ID:4fbcKkyu
変数strにはさまざまな文字列が入る可能性があり"apple"か"banana"のどちらかが入っていたときのみtrueを返すようにしたいのですが、
どのように書けばよいのでしょうか

str == (("apple") || ("banana"))

のようにかけるかと思ったのですがうまくいきませんでした
これは論理演算子の左辺がfalseだった場合、右辺は実行されないというrubyの仕様によるものだということはわかったのですが、
ではどうしたらいいのかということがわかりません
0826デフォルトの名無しさん2016/09/11(日) 16:06:07.87ID:qOBSijlm
((str == "apple") || (str == "banana"))
0827デフォルトの名無しさん2016/09/11(日) 16:16:38.56ID:4fbcKkyu
>>826
教えていただきありがとうございます
助かりました
0828デフォルトの名無しさん2016/09/11(日) 16:32:54.36ID:UPswGxCa
%w[apple banana].any?{|s| s == str}
!!(str =~ /\A(apple|banana)\z/)
やり方はいろいろ
0829デフォルトの名無しさん2016/09/11(日) 18:08:52.74ID:7mVeUw5e
['banana','apple'].include?(str)
0830デフォルトの名無しさん2016/09/13(火) 08:22:10.35ID:LgDBG7c/
> これは論理演算子の左辺がfalseだった場合、右辺は実行されない
0点


論理和
論理積

コード(演算子)の処理順序

などを少し整理する事をすすめる
0831デフォルトの名無しさん2016/09/13(火) 16:29:06.06ID:aXWSAFy4
あるサイトページをnokogiriで拾うと、正規のURLと文字化けしたURL(%などが含まれる)の2種類のURLで同一の情報を拾ってしまいます。
正規のURLだけの情報えお拾いたいのですがどのような方法がありますでしょうか?
0832デフォルトの名無しさん2016/09/13(火) 16:35:24.92ID:aXWSAFy4
ちなみに、

anemone.skip_links_like /除外対象のURLパターン/

で文字化け部分を指定しても改善にはいたりませんでした。
0833デフォルトの名無しさん2016/09/13(火) 16:36:46.35ID:80RPfzdF
文字化けというのはURLエンコードのこと?
0834デフォルトの名無しさん2016/09/13(火) 16:45:49.24ID:aXWSAFy4
>>833
URLエンコードです。
デコードすると正規のURLに変換できます。
0835デフォルトの名無しさん2016/09/13(火) 16:46:32.94ID:Z1s//V7/
取得したURLをすべて%付きに変換(正規化)するだけじゃないの?
%なしを正規として扱うのはわかってやらないのならオススメしない。
0836デフォルトの名無しさん2016/09/13(火) 16:51:13.41ID:80RPfzdF
デコードしていく方法で考えたらいいんじゃないかな
一応検索したら出てきたもの
http://qiita.com/foloinfo/items/435f0409a6e33929ef3c
0837デフォルトの名無しさん2016/09/13(火) 17:04:47.99ID:mdhMcfhG
nokogiriじゃなくてanemoneの問題だろ
focus_crawl で、いらないとお前が思うリンクを弾いたら?
0838デフォルトの名無しさん2016/09/13(火) 17:19:43.00ID:aXWSAFy4
>>836
参考リンクの情報ありがとうございます。
一通り試してみますm(_ _)m

>>837
ご返信ありがとうございます。
具体的に申しますと、

[ → %5B
] → %5D

のように、カッコ部分がエンコード/デコードで重複して出力されます。
link.to_s.matchで[●●]や%5B●●%5Dといった条件付けで巡回ページを指定しても、
両方のパラメータが出力されてしまうようです。
0839デフォルトの名無しさん2016/09/13(火) 19:00:51.61ID:sMHYkxL7
正規化して重複したら弾くだけじゃないの?
0840デフォルトの名無しさん2016/09/15(木) 01:10:39.64ID:EGe9UG5c
moduleの中でプライベートなインスタンスメソッドを定義するのって変?
クラスにincludeした際にmoduleの別のインスタンスメソッドから呼び出すために用意してみたんだけど…
ちなみにクラスメソッドのような使い方は想定してないのでmodule_functionとかは利用しなかった
0841デフォルトの名無しさん2016/09/15(木) 19:46:09.23ID:8swlNZts
data = [ { :name => "foo", :address => "fugafuga"},
{ :name => "bar", :address => "piyopiyo"} ]

↓で「data」の中のハッシュを取り出せました

data.each do |list|
puts list[:name]
puts list[:address]
end

「data」から「:address」に"fuga"を含むハッシュだけを取り出したいんですがうまくいきません
どうかアドバイスをお願いしますm(_ _)m
0842デフォルトの名無しさん2016/09/15(木) 20:05:06.44ID:2bVUIpAa
data.select{|it| it[:address] == "fugafuga" }
0843デフォルトの名無しさん2016/09/15(木) 21:56:41.38ID:4Lbf8yku
>>842
ありがとうございます
試して見ます!
0844デフォルトの名無しさん2016/09/15(木) 23:26:56.53ID:UCCDVfNQ
横レスだけど、>>842を試してみた

https://ideone.com/xp2IB6
0845デフォルトの名無しさん2016/09/16(金) 01:04:31.60ID:egLfcP1P
たびたびすいません
fugafgaではなくgafで抽出したい場合は正規表現使う感じでしょうか
0846デフォルトの名無しさん2016/09/16(金) 06:12:33.38ID:DLAZUyzS
リファレンス読もうselectはブロック内で真を返すもののみ残すので正規表現でいけるよ
0847デフォルトの名無しさん2016/09/16(金) 07:56:10.76ID:6a7QMzs2
Effective Ruby の項目10に書いてあるけど、

構造化データを扱う際、Hashの配列よりも、
クラスまたは、Struct(簡易クラス、クラスジェネレータ)のような専用の型を、使った方がいい

data[:name]
キー名のような実装の詳細が、隠蔽されず表に出てくる。
また、存在しないキーは、nilとなる

Person = Struct.new(:name, :address) #定数に代入
data = Person.new("foo", "fugafuga")
data.name

Structでは属性になるから、getter, setter も付いているし、
存在しない属性名でアクセスすると、NoMethodErrorになる
0848デフォルトの名無しさん2016/09/16(金) 09:30:54.73ID:DLAZUyzS
>>847
複雑にネストしたJSONとかでもそっちのが良いの?
うまく使いこなせる気がしない
0849デフォルトの名無しさん2016/09/16(金) 09:37:52.73ID:6a7QMzs2
>>845
data.select{|it| it[:address].match(/gaf/) }
0850デフォルトの名無しさん2016/09/16(金) 09:44:38.44ID:6a7QMzs2
型として固定されている場合は、クラス・Structの方がいい

一方、項目がコロコロ変わるような場合、
何の項目が来るのか、わからない場合は、Hashがいい
0851デフォルトの名無しさん2016/09/16(金) 10:32:56.00ID:S3qmK1Rf
>>850
EffectiveRubyの項目10を読んでみました
プログラミング初心者なので書いてあることの半分も理解できませんが
クラス化して汎用性のあるものを作れるように最初から読み込んでみます!

なんとなくやってみたいことが動くというところまでは行きたいので
文字のマッチングから>>841の「data[0]」を出力できるところまでやってみたいと思います
ありがとうございます!
0852デフォルトの名無しさん2016/09/16(金) 23:44:30.69ID:6a7QMzs2
初心者には、EffectiveRuby は難しい。
まず「たのしいRuby 第5版、2016」で文法を勉強すべし

クラス・Structは、DBのレコードのように、項目が固定されている場合に使う

一方、Hashは、事前に項目(キー)がわからない場合。
例えば、文章に出てくる英単語を、使用回数が多い順に並べるとか
0853デフォルトの名無しさん2016/09/17(土) 00:12:19.00ID:PduQX1gX
言語リファレンス読めて習作いくつか書けたら
そのレベルの本はいらんやろ。
0854デフォルトの名無しさん2016/09/17(土) 15:43:11.73ID:3YKrhMdt
obj = Foo(x)
みないた、newを使わないインスタンスの生成方法って可能ですか?
以前どこかでこの形を見たような記憶があるのですがとてもあやふやで、
確認しようと色々さがしてみたら見当たりませんでした
やはり記憶違いでしょうか?
0855デフォルトの名無しさん2016/09/17(土) 15:43:54.52ID:VbfmfVd0
>>854
Foo というメソッドを定義すればいい
0856デフォルトの名無しさん2016/09/17(土) 18:42:02.15ID:9X+eFsUZ
任意の枚数のトランプを仕分けするプログラムで悩んでいます。
最初にカードの枚数が与えられ、次にカードのシンボルと数字がスペース区切りのセットで与えられます。
例えば、スペードの5なら「S 5」と言った感じです。自分はまだ初心者なので効率的なやり方がわからず、
とりあえず、case文で場合分けして配列に入れるやり方を考えてみました。以下が組んだコードです。

num=gets.to_i
s=[]
h=[]
c=[]
d=[]

i=1
while i<=num
symbol, numeric = gets.chomp.split
case symbol
when symbol=="S"
s<<numeric
when symbol=="H"
h<<numeric
when symbol=="c"
c<<numeric
when symbol=="d"
d<<numeric
end
i+=1
end
print s
とりあえず確認がてらスペードの配列を表示させようとしたら、空配列しか返ってきません。どの部分がおかしいのか
ご指摘いただけませんでしょうか。
0857片山博文MZ ◆T6xkBnTXz7B0 2016/09/17(土) 19:13:41.02ID:VM86FVmf
>>856
大文字と小文字が混じってるね。
0858デフォルトの名無しさん2016/09/17(土) 19:21:36.45ID:Bzzyu0/Q
>>856
case when構文がおかしいので再確認を

caseで場合分けせんでも
cards = Hash.new{|h,k| h[k] = [] }
while i <= num
symbol, numeric = gets.chomp.split
cards[symbol] << numeric
i += 1
end
でいいんじゃないかなと思うんだが
0859デフォルトの名無しさん2016/09/17(土) 19:39:53.49ID:9X+eFsUZ
>>857
うぬ・・・いつのまに・・・めんぼくない
>>858
おお、動きました。すごいな。あまりよくわからないけど、なんとなくわかりました。ありがとうございました。
とにかく、「動いた」のが素晴らしい。あと、できれば、前述のコードが意図したとおりにならない理由を
教えていただけるとありがたいです。
0860デフォルトの名無しさん2016/09/17(土) 21:27:40.73ID:owPS/qUi
だからcaseの構文がおかしいっていわれてるじゃん!

case symbol
when 'S'
s << numeric
......

まあこの場合は when 'S' then s << numeric と1行で書くのもアリ
0861デフォルトの名無しさん2016/09/17(土) 22:34:10.05ID:/l22qB3W
>>854
RubyやめてPythonへ行けばいい
0862デフォルトの名無しさん2016/09/17(土) 23:58:36.86ID:owPS/qUi
>>854

class Foo
  def self.[](a)
    new(a)
  end
end

foo = Foo[0]
p foo.class #=> Foo
0863デフォルトの名無しさん2016/09/18(日) 09:35:45.27ID:MJhMf8Pu
>>860
なるほど!書かれるまで全く気付かなかった・・・確かに書き方がおかしい
ありがとうございます。
0864デフォルトの名無しさん2016/09/18(日) 17:41:19.27ID:aAaRWXxI
シンタックスエラーごときを自分で直せないならプログラマの素質なし
■ このスレッドは過去ログ倉庫に格納されています