Ruby 初心者スレッド Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/07/29(日) 14:26:28.92質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ
前スレ
Ruby 初心者スレッド Part 49
http://toro.2ch.net/test/read.cgi/tech/1336507487/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/
0756743
2012/12/10(月) 17:48:00.070757デフォルトの名無しさん
2012/12/12(水) 08:50:03.28この処理ができるならやって、できないならスルー
ってどう書けばよいでしょうかw
具体的には複数のテキスト内を順番にサーチしていき
ある文字列があるならそれを取り出し、なければなにもしないという処理をしたいです
if サーチした結果 = nil
p 1
else
p 2
end にしたら全部2になるし
if サーチした結果 = ""
にしたら全部1になるしで判別できません
0758デフォルトの名無しさん
2012/12/12(水) 11:05:20.51==が比較
if サーチした結果 == nil
とする。
あるいは
if サーチした結果.nil?
とか
if !サーチした結果
とか
unless サーチした結果
とする。
0759デフォルトの名無しさん
2012/12/12(水) 11:48:48.85書いてみたコードを晒したら、アドバイスしやすい。
0760デフォルトの名無しさん
2012/12/12(水) 11:58:04.85返ってくる値がnilじゃなくて""だったので
h = サーチした結果
unless h == ""
テキストとってくる
end
これでうまくいきそうです
0761デフォルトの名無しさん
2012/12/13(木) 00:10:06.22if conditionとunless !conditionって同じですよね?
unlessを使うと、
・タイプ数が多くなる
・手続き中に正常系と異常系が混在して頭の切り替えコストが増える
・二重否定が可能
なんだけどメリット有るんですか?
0762デフォルトの名無しさん
2012/12/13(木) 00:13:32.900763デフォルトの名無しさん
2012/12/13(木) 00:18:15.21* 後置するとブロークンイングリッシュとして読みやすくなる場合がある。
* if !condition だと ! を見落としやすい (if ! condition のように間を開けて見やすくする流儀もある)。
尚、unless には else 節を付けないほうがいい。
それこそ二重否定でわかりづらくなる。
0764デフォルトの名無しさん
2012/12/13(木) 00:25:15.57なんかJavaとかでifに常に{}書けという主張とやや似てる
0765デフォルトの名無しさん
2012/12/13(木) 00:34:01.73> This is provided as a more readable version of "if (!condition)".
とだけ。
0766デフォルトの名無しさん
2012/12/13(木) 00:44:13.43同意できないw
0767デフォルトの名無しさん
2012/12/13(木) 01:18:12.72puts "#{i+1} / #{SIZE_OF_ARRAY}"
end
とかしたいだんけどSIZE_OF_ARRAYを表す組み込み変数とか無いの?
array = [1,2,3]
array.each_with_index do |e, i|
puts "#{i+1} / #{array.size}"
end
だと変数への代入が増えて何かダサイ
0768デフォルトの名無しさん
2012/12/13(木) 01:20:29.820769デフォルトの名無しさん
2012/12/13(木) 01:24:16.83# 全然解決になってない:)
0770デフォルトの名無しさん
2012/12/13(木) 01:33:08.50おまえのような雑魚が同意できなかったところで誰も困らない
Larryが使いやすければ、それでいい
0771デフォルトの名無しさん
2012/12/13(木) 01:51:26.84def with_size(&blk)
return to_enum(:with_size) unless blk
ary = to_a
size = ary.size
ary.each{|args|
blk[*args, size]
}
end
end
%w(a b c).each_with_index.with_size{|s,i,n|
p [s,i,n]
}
0772デフォルトの名無しさん
2012/12/13(木) 23:29:31.42rubyでプログラムを実行し、表示させた結果をメモしないままターミナルを閉じてしまいました。
表示履歴を見る方法はありますか?
0773デフォルトの名無しさん
2012/12/13(木) 23:34:34.31入力したコマンドラインの履歴でよければ$HOME/.bash_historyとかに入ってる可能性があるけど
0774デフォルトの名無しさん
2012/12/13(木) 23:42:24.44コマンドラインじゃなくて、コマンドラインで実行させた結果が知りたいです。
詳しい人に初期設定してもらったので、ひょっとしたらログを保存する設定になっているかもしれません。
その場合、どう入力したらいいかご存知でしょうか?
ググってもググってもよくわからないんです・・・!
0775デフォルトの名無しさん
2012/12/13(木) 23:48:34.19「ほー」と思った記憶があるんだけど幻だったのかな・・・
0776デフォルトの名無しさん
2012/12/13(木) 23:52:28.56その詳しい人に聞いたらいいじゃないか
ちなみにターミナルっていっても色々あるけどmacの場合はこんなのが出てきた
http://at-fog-of-index.blog.so-net.ne.jp/2010-12-24
0777デフォルトの名無しさん
2012/12/14(金) 00:10:35.36その詳しい人はある日出社しなくなったまま行方不明になってしまったのでなんとも・・・
今後はちゃんと保存しておくよう、教えていただいた方法で設定しておきますね、ありがとうございます。
今回はもう諦めて上司に土下座することにします。
これを機にいろいろとrubyを勉強しよう、そうしよう・・・
0778デフォルトの名無しさん
2012/12/14(金) 00:17:36.010779デフォルトの名無しさん
2012/12/14(金) 00:18:50.850780デフォルトの名無しさん
2012/12/14(金) 01:03:06.56これならシェルの引数をそのまま渡した方がまだましだわ。
0781デフォルトの名無しさん
2012/12/14(金) 01:08:53.910782デフォルトの名無しさん
2012/12/14(金) 01:11:01.80なんかC臭さの残る仕様だわ。
0783デフォルトの名無しさん
2012/12/14(金) 01:33:04.23railsのrakeもそうなってるしな。
0784デフォルトの名無しさん
2012/12/14(金) 02:17:12.12↓おおげさ
class HogeException < Exception
end
begin
raise HogeException.new
rescue HogeException
puts "うわー"
end
↓こんな感じで書きたい
begin
raise :hoge if hoge
raise :fuga if fuga
rescue :hoge
puts "うわー"
rescue :fuga
puts "ぬわー"
end
0785デフォルトの名無しさん
2012/12/14(金) 02:17:53.000786デフォルトの名無しさん
2012/12/14(金) 04:58:42.95Rubyにおける例外クラス定義とraiseとrescueはおおげさでもなんでもない
Javaのように管理しようとすると破綻するぞ
0787デフォルトの名無しさん
2012/12/14(金) 07:54:51.75アプリケーションエラー以外の例外クラス名を思いつかなくて事前にifで避けられるならifで避けたほうがマシ
0788デフォルトの名無しさん
2012/12/14(金) 10:54:38.25case exp =
catch(:exp) do
throw(:exp,:hoge) if hoge
throw(:exp,:fuga) if fuga
end
when :hoge then puts 'うわー'
when :fuga then puts 'ぬわー'
end
0789デフォルトの名無しさん
2012/12/14(金) 10:56:32.73(´・ω・`)…
0790デフォルトの名無しさん
2012/12/14(金) 19:31:55.86flag='うわー'
begin
raise 'うわー' if flag=='うわー'
raise 'ぬわー' if flag=='ぬわー'
rescue Exception => ex
case ex.message
when 'うわー'
puts ex.message
when 'ぬわー'
puts ex.message
end
end
0791デフォルトの名無しさん
2012/12/14(金) 19:36:33.22最早なんのためになにを避けてたんだかわからなくなってるな
0792デフォルトの名無しさん
2012/12/14(金) 20:14:27.84> ↓こんな感じで書きたい
> begin
> raise :hoge if hoge
> raise :fuga if fuga
> rescue :hoge
> puts "うわー"
> rescue :fuga
> puts "ぬわー"
> end
元がコレだからな
なんで例外使いたいんだか
0793デフォルトの名無しさん
2012/12/14(金) 20:26:11.930794デフォルトの名無しさん
2012/12/14(金) 22:53:54.040795デフォルトの名無しさん
2012/12/14(金) 23:03:50.62attr_reader :sym
def initialize(sym)
@sym = sym
end
end
class Symbol
alias old_match ===
def ===(obj)
return old_match(obj) unless SymbolException === obj
obj.sym == self
end
end
def raise(*args)
Kernel.raise *args unless args.length == 1 && Symbol === args[0]
raise SymbolException.new(args[0])
end
begin
raise :hoge
rescue :fuga
p "fuga"
rescue :hoge
p "hoge"
end
こんなの実装できるとかRuby変態だろ…
0796デフォルトの名無しさん
2012/12/15(土) 00:57:15.80>こんなの実装できるとかRuby変態だろ…
偽装Lispだからな。
0797デフォルトの名無しさん
2012/12/15(土) 01:02:50.15おまいらなら、余裕でRuby GOLDが取れそうだな。
0798デフォルトの名無しさん
2012/12/15(土) 02:12:28.77なんでもかんでも重複を省こうとする
アホちゃうかと
読みやすさ、メンテのしやすさ、手間、バランスを考えろ
0799デフォルトの名無しさん
2012/12/15(土) 02:32:23.51そこが分かってない。
0800デフォルトの名無しさん
2012/12/15(土) 05:33:45.21def doya
if a == 1# えー
|| b =~ /hoge/ # びー
|| c !~ /moge/ # しー
|| d.empty? # でー
|| !e.nil? # いー
then
puts "わーい"
else
puts "ぐはあ"
end
end
とか書けないんだ。
0801デフォルトの名無しさん
2012/12/15(土) 05:35:48.83一行で書けるブロックコメントも無いしなぁ
def doya_sub
if a == 1 || b =~ /hoge/ || c !~ /moge/ || if d.empty? || !e.nil?
puts "わーい"
else
puts "ぐはあ"
end
end
じゃあ↓こうする?
こりゃりたーんりたーん五月蝿いなぁw
def doya
puts doya_sab ? "わーい" : "ぐはあ"
end
def doya_sub
return true if a == 1# えー
return true if b =~ /hoge/ # びー
return true if c !~ /moge/ # しー
return true if d.empty? # でー
return true if !e.nil? # いー
return false
end
0802デフォルトの名無しさん
2012/12/15(土) 07:13:54.44はい、Ruby的には判断できませぬ
インデントとか揃わなくてかっこ悪いとたいへん不評なのですが
if
cond1 || # when 1
cond2 || # when 2
cond3 # when 3
then
のようにorを後ろに書いてくだされ
0803デフォルトの名無しさん
2012/12/15(土) 07:25:33.12if cond1 || # when 1
cond2 || # when 2
cond3 # when 3
then
0804デフォルトの名無しさん
2012/12/15(土) 19:21:50.57groovyと比較するとbegin-endの方が目に優しいね
0805デフォルトの名無しさん
2012/12/16(日) 01:30:47.96記号含有率を下げると同時に、`波括弧を目立ちやすくする
という設計意図があるらしい
0806デフォルトの名無しさん
2012/12/16(日) 04:28:35.10トークンとして長くて大きくて実質"予約語"として命名余地を圧迫してることは否定しないが、使用中の見易さそのものは大差ねえよ
0807デフォルトの名無しさん
2012/12/16(日) 04:32:17.380808デフォルトの名無しさん
2012/12/16(日) 08:49:25.760809デフォルトの名無しさん
2012/12/16(日) 12:49:58.30スクリプトから特定のバージョンを指定で実行するようにしたい時は
#!/Users/username/.rvm/rubies/ruby-1.9.2-p290/bin/ruby
とかしないといけないんでしょうか。
これだとバージョンを上げるとスクリプトを修正しないといけないので、
#!/Users/username/.rvm/rubies/ruby-1.9
とかで指定できて、rvmで自動的に最新の1.9系へのシンボリックリンクがはられる、
みたいのができると便利だと思うんですけどできないですか?
0810デフォルトの名無しさん
2012/12/16(日) 13:24:54.53rvm に 1.9系の最新 みたいな概念はないんじゃない?
0811デフォルトの名無しさん
2012/12/17(月) 04:53:24.51定数のように値を後で変更できない配列やhashを作成することはできませんか?
0812デフォルトの名無しさん
2012/12/17(月) 05:28:33.09irb> a.freeze
irb> a << 3
RuntimeError: can't modify frozen array
irb> p a
[1, 2]
ただ、実際のところはそれほど強制的な効果はなく、わりと嫌われてもいる
ユーザーに値を変更して欲しくないのなら、マニュアルにそう書くか、そもそも自己責任で放置するほうがよい
0813デフォルトの名無しさん
2012/12/17(月) 06:04:06.74変更したらうまく動作しない可能性があるのも「当たり前」
「これを外部から変更されたらプログラムが誤動作するので変更を禁止したい」
とか過保護または過敏に考える必要はない
0814デフォルトの名無しさん
2012/12/17(月) 06:57:23.260815デフォルトの名無しさん
2012/12/17(月) 06:59:51.340816デフォルトの名無しさん
2012/12/18(火) 00:14:43.70Railsのソース見てもfreezeぐらいたくさん出てくるのに。
0817デフォルトの名無しさん
2012/12/18(火) 04:35:32.860818デフォルトの名無しさん
2012/12/18(火) 11:15:16.40こういうのじゃダメなの?
class << FOO=Object.new
def bar
1
end
def baz
2
end
end
0819デフォルトの名無しさん
2012/12/18(火) 19:37:56.040820デフォルトの名無しさん
2012/12/19(水) 11:32:58.13class Counter < BasicObject
def initialize
@count = 0
end
def plus(n)
@count += n
end
def method_missing(*a)
@count.send(*a)
end
end
みたいな感じのクラスを作って思い通りの動作は得られたのですが、
インスタンスの.classがFixnumになってしまうのがどうにも・・・
他にうまい実装方法ありませんかね?
0821デフォルトの名無しさん
2012/12/19(水) 12:17:38.57ancestorsは? kind_of? は? instance_methods で plus が出ないけどいい?
ということで選んで移譲するのがいいように思う
てゆーか Object や Module のメソッドを使いたいなら BasicObject の直接継承なんてやってはいかんぜよ
0822デフォルトの名無しさん
2012/12/19(水) 12:59:51.22class Counter
attr_reader :count
def initialize
@count = 0
end
def plus(n)
@count += n
end
end
こういうクラスがあったとして
counter = Counter.new
counter.count #こうじゃなくてcounter単体で@countの値を得たい
つまり.countを省略したいと言うだけのことなのです
委譲を使って下記のようにも書けたのですが・・・そういうことではないんですかね?
class Counter < DelegateClass(Integer)
def initialize
super 0
end
def plus(n)
__setobj__ self + n
end
end
0823デフォルトの名無しさん
2012/12/19(水) 21:58:40.90pでの表示はinspectとか、文字列に埋め込んだりするとto_sとかが呼び出されて変換されますが
足し算などでは勝手に何かメソッドを呼んでくれたりはしないんでしょうか?
0824デフォルトの名無しさん
2012/12/19(水) 23:57:44.76class C
# C.new + 10 #=> 110
def +(other) 100 + other end
# 10 + C.enw #=> 110
def coerce(n) [n,100] end
end
0826デフォルトの名無しさん
2012/12/20(木) 22:53:23.660827デフォルトの名無しさん
2012/12/21(金) 01:29:03.32ruby ファイル名.rb で必要な情報一覧はLinuxコンソール上から叩くと取得出来ています。
これをブラウザ上にテキスト形式でどの様に表示させればいいのか解らず、sinatraと言うフレームワークもためしましたが上手く行かず、、、
多分凄い簡単な気もするのですが全くわかりません。
テキストにしたいと言う理由は実行結果をjson形式の書式に無理やり変えている為です。require jsonは利用してません。DBは利用してません。
プログラミング自体初心者です。。
0828デフォルトの名無しさん
2012/12/21(金) 02:14:25.800829デフォルトの名無しさん
2012/12/21(金) 02:17:30.67とりあえず、ここを嫁。
http://www.sinatrarb.com/intro-jp.html
んでhttp://localhost:4567をWebブラウザでアクセスしてうまくいってそうなら、
次は、↓みたいにparamsってHashの変数を使うように書き換えて再起動して、
# myapp.rb
require 'sinatra'
get '/' do
return '嫁は' + params[:yome] + '妹' + params[:imouto]
end
↓でアクセスして引数が参照できたら、
http://localhost:4567/?yome=morisama&imouto=rikka
あとは好きにいじって行け。
あとHTTPの勉強が少し要ると思う。
0830デフォルトの名無しさん
2012/12/21(金) 02:24:11.23有り難うございます。
:4567で起動はしてるのですが、Linuxのコンソール上には結果は出ていてエラーもありません。
ですがブラウザは真っ白な状態になっていてソースを表示しても何も入ってないと言う感じです。
スクリプトの結果をコンソールと同じ様にしたいだけなのにそれがどうしても出来ません。
0831デフォルトの名無しさん
2012/12/21(金) 02:30:02.59ちなみにコードは
get '/' do
ここにまるごと張り付けてます。
end
ハッシュを利用しないといけないのであればなぜそうなのかが公式見ても理解出来ません。。。
0832デフォルトの名無しさん
2012/12/21(金) 02:47:36.880833デフォルトの名無しさん
2012/12/21(金) 02:56:23.28コンソールへの出力にputsとか使ってるんだろう?
putsは引数の文字列をlinuxコンソールに出力するメソッド(本当は違うけど)
今現在コンソールに出力されてる文字列をブラウザに送るにはどうすればいいかは
829に書いてくれてあるのをみればわかるだろわかるよなわかってくれよそんくらい
0834デフォルトの名無しさん
2012/12/21(金) 03:26:47.76get '/' do
return "森夏ちゃんエロい"
end
とかいて、表示したいもんを文字列にしてreturnで返せ。
そうしたらブラウザで
http://localhost:4567/
にアクセスすると"森夏ちゃんエロい"が表示されるんだよ。
0835デフォルトの名無しさん
2012/12/21(金) 03:51:48.91│●│
└─┤
_ ∩
( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘
0836デフォルトの名無しさん
2012/12/22(土) 14:51:40.51s = gs.accept()
s.puts("あ")
でクライアントに"あ"が送信されますが送信文に改行\nを加えるとそこで送信文が終わってしまします
つまりs.puts("あ\nい")とするとクライアントは"あ"しか受信してくれません
なんとかなりませんか
0837デフォルトの名無しさん
2012/12/22(土) 14:58:50.35http://doc.ruby-lang.org/ja/1.9.3/method/IO/i/gets.html
0838デフォルトの名無しさん
2012/12/23(日) 00:52:07.77皆さんどうしていますか
0839デフォルトの名無しさん
2012/12/23(日) 01:41:22.82exit も打てなくて C-c も使えないということ?
じゃ、GUIのタスクマネージャから終了させる
コマンドラインだったら、別の DOS プロンプトから tasklist で
実行時期が早めの DOSプロンプト(cmd.exe)の pid を調べて kill する
0840デフォルトの名無しさん
2012/12/23(日) 08:32:59.15嘘を教えるな
irb.exe もしくは ruby.exe の pid を調べて kill する
0841839
2012/12/24(月) 00:28:12.80フォローありがとう
0842デフォルトの名無しさん
2012/12/28(金) 11:02:17.08してrubyでメールを送ることに成功したのですが、宛先がgmailのときだけ
/usr/lib/ruby/1.8/net/smtp.rb:942:in `check_response': 553 5.7.1 <[email protected]>... Relay operation rejected (Net::SMTPFatalError)
from /usr/lib/ruby/1.8/net/smtp.rb:911:in `getok'
from /usr/lib/ruby/1.8/net/smtp.rb:854:in `rcptto'
from /usr/lib/ruby/1.8/net/smtp.rb:835:in `rcptto_list'
from /usr/lib/ruby/1.8/net/smtp.rb:833:in `each'
from /usr/lib/ruby/1.8/net/smtp.rb:833:in `rcptto_list'
from /usr/lib/ruby/1.8/net/smtp.rb:654:in `sendmail'
from ./mailtest.rb:26:in `sendmail'
from /usr/lib/ruby/1.8/net/smtp.rb:526:in `start'
from /usr/lib/ruby/1.8/net/smtp.rb:463:in `start'
from ./mailtest.rb:25:in `sendmail'
from ./mailtest.rb:68
となって失敗してしまいます。対処法をご存知のかたは教えて下さい。
0843842
2012/12/28(金) 11:51:38.09smtpの認証パラメータを設定していなかったのが原因でした
0844デフォルトの名無しさん
2012/12/31(月) 07:06:44.40test01
うんこ
うんち
う○こ
のように書かれているとします。
このうち「う○こ」を「うんこ」に置き換えたいのですがどうすればいいですか?
ファイルに直接変更を加えるということです。
0845デフォルトの名無しさん
2012/12/31(月) 10:37:49.710846デフォルトの名無しさん
2012/12/31(月) 11:02:01.60例
1.ファイルを一時ファイルにコピーする。
2.もとのファイルの名前で新しいファイルをつくる(書込み用)
3.一時ファイルを1行ずつよんで、該当する部分を変更して書込み用ファイルに出力する。
0847デフォルトの名無しさん
2012/12/31(月) 11:13:30.77文字列中で pattern にマッチした最初の部分を文字列 replace で置き換えた文字列を生成し返します
gsub(pattern, replace)
文字列中で pattern にマッチする部分全てを文字列 replace で置き換えた文字列を生成し返します
リファレンスマニュアル
0848デフォルトの名無しさん
2012/12/31(月) 11:15:02.140849デフォルトの名無しさん
2012/12/31(月) 11:17:08.53rubyで考えるよりも早いんじゃない
0850デフォルトの名無しさん
2012/12/31(月) 11:18:17.520851デフォルトの名無しさん
2012/12/31(月) 18:59:24.83>>847の方法を使う必要がある
フィルタ的に使うのに意外と
手間がかかるよねrubyは
0852デフォルトの名無しさん
2012/12/31(月) 19:26:52.360853デフォルトの名無しさん
2012/12/31(月) 20:07:43.050854デフォルトの名無しさん
2012/12/31(月) 20:09:58.73Windows版なんて聞いたことないし、あったとしても
どこの馬の骨が作ったかわからないフリーソフトレベルだろうから
大事なテキスト処理は任せられないなあ
多くのユーザーに揉まれたUnixツール群は偉大だ
0855デフォルトの名無しさん
2012/12/31(月) 20:36:15.57■ このスレッドは過去ログ倉庫に格納されています