トップページ⇒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/
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人が同じような実装書いたら自動でオリジナルに反映されるクラウド型言語にすれば
車輪の再開発も最小限に抑えられるのに
0332デフォルトの名無しさん2014/08/17(日) 19:21:09.40ID:Ot0PKOG+
車輪の再発明がなかったらRails使ってるような人間はほとんど失業するよ
0333デフォルトの名無しさん2014/08/17(日) 19:51:54.11ID:sI1u/7Zz
あんただけです
0334デフォルトの名無しさん2014/08/17(日) 20:12:47.24ID:wn4TLg6+
>>331
100アカウント作る作業が捗りますね。
0335デフォルトの名無しさん2014/08/18(月) 18:39:08.27ID:MNhNsEMr
文字列の変数に\nや\tを追加するにはどうすればいいのでしょうか?

str = String.new
str << "hello"
str << "\n"
str << "world"
p str

とやると、 "hello\nworld" が出力されてしまいます
<< の代わりに + を試してみたり、クオーテーションマークを変更してみたのですが上手く行きませんでした
ご存じの方がいらっしゃったら教えて下さい
0336デフォルトの名無しさん2014/08/18(月) 18:55:10.29ID:RYTp3JkD
>>335
pではなくprintやputsを使う
0337デフォルトの名無しさん2014/08/18(月) 19:07:53.97ID:MNhNsEMr
>>336
ああ、ほんとだ!
pやputs、printの微妙な違いを理解していませんでした
教えて下さりありがとうございます!
0338デフォルトの名無しさん2014/08/18(月) 21:43:14.89ID:DSQRQPi5
正規表現について何か方法があれば教えてほしいです
文字列から以下のようにscanすると、1回目のマッチで先頭の12111を消費してしまうので
残りは2111となってマッチせず、戻り値は1要素になります
"121112111".scan(/1+21+/) #=> ["12111"]

元の文字列の中で、以下のように正規表現に当てはまるすべてのパターンを抽出したいとき
簡単にできる方法はあるでしょうか?
"121112111".??? /1+21+/ #=> ["12111","1112111"]

その後文字数を数えたりしたいので、先読みだけでは期待通りになりませんでした
"121112111".scan(/1+2(?=1+)/) #=> ["12", "1112"]
0339デフォルトの名無しさん2014/08/18(月) 22:12:57.28ID:fWx8XBuA
>>338

irb(main):001:0> xs = "121112111"
=> "121112111"
irb(main):002:0> (0..(xs.size - 1)).map { |i| xs[i, xs.size - i].scan /1+21+/ }.flatten.uniq
=> ["12111", "1112111", "112111"]
irb(main):003:0>
0340デフォルトの名無しさん2014/08/18(月) 22:16:57.84ID:8phCtYDa
>>338
メソッド1つでやる方法はない
ループ回してやるぐらいだろう
0341デフォルトの名無しさん2014/08/18(月) 22:50:50.95ID:DSQRQPi5
>>339,340
ありがとうございます
やっぱり単純な方法はなさそうですね
今回に限っては以下のように対処することにしました
"121112111".gsub(/1+/){"#$& #$&"}.scan(/1+21+/)
=> ["12111", "1112111"]
0342デフォルトの名無しさん2014/08/18(月) 23:07:32.88ID:kHWBbVG2
"121112111".scan(/(?=(1+21+))/).flatten #=> ["12111", "1112111", "112111", "12111"]
0343デフォルトの名無しさん2014/08/19(火) 22:06:10.54ID:4T9lOZln
オンメモリで処理しきれないような大量の1と2が入り混じった
文字列を処理するお題が「次」に出るに違いない・・・そう、これは
ブラフだ。きっと010001000に置き換えてビット演算で効率のいい
アルゴリズムを考えないと解けないようにできているんだ・・・!
0344デフォルトの名無しさん2014/08/20(水) 23:56:22.60ID:Hb2EFkIX
if [email protected]?
 @list.each do |e|
  e.foo
 end
end
って書くののなんかダサいから、
nil.to_aで[]が返るのを使って、
@list.to_a.each do |foo|
  foo.xxx
end
ってするのはどうかな?
to_aだけだと@listがnilの可能性がある事を示せなくて紛らわしいかな?
0345デフォルトの名無しさん2014/08/20(水) 23:59:39.84ID:Hb2EFkIX
@list.to_a.each do |e|
  e.foo
end
だった。
0346デフォルトの名無しさん2014/08/21(木) 00:45:52.00ID:im1RGGTy
>>344
Array(@list).each

という書き方はよく使うね
0347デフォルトの名無しさん2014/08/21(木) 02:06:12.53ID:x7AE9dcj
>>344
「引数(orインスタンス変数)は配列互換。途中でエラーになるんでよろしく」とマニュアルに太字で書いておく

いやわりとマジで
メソッドに外部から投げ入れるオブジェクトのクラスがナニかというのを徹底するのは人間の仕事
0348デフォルトの名無しさん2014/08/21(木) 02:08:32.65ID:Rf32jxet
>>347
動的型付け言語は大変だな。
0349デフォルトの名無しさん2014/08/21(木) 02:18:40.09ID:x7AE9dcj
まあどうあれ、あまり愉快ではない

def hoge(arg)
arg.each do |e|

と書いた時点で「いや待てよargが配列じゃなかったらどうしよう、ちょっと変わったHashの可能性もあるよな、よし対処しよう」と考え

   な い

というのは、直感やおもてなしのココロ(って何)には反する
0350デフォルトの名無しさん2014/08/21(木) 13:02:24.41ID:cuQAWRrR
sinatra使ってます。
Postデータのエンコードとバリデーションをしたいのですが
良いライブラリはありますでしょうか
0351デフォルトの名無しさん2014/08/21(木) 17:35:17.83ID:yvxtVK3I
>>349
その例の場合は

def hoge(*args)

にしちゃうかな、配列が複数ある場合は無理だけど…
0352デフォルトの名無しさん2014/08/21(木) 21:32:48.95ID:JmIsso9r
>>344,345
> って書くののなんかダサいから、

どうやら Ruby の作者も「if [email protected]?」はダサいと感じていたみたいで、
結果として「unless @list.nil?」という珍しい文法が Ruby に追加された
同様にして「while [email protected]?」もダサいので「until @list.nil?」も追加された


> to_aだけだと@listがnilの可能性がある事を示せなくて紛らわしいかな?

@list の値が nil のケース(=リストそのものが存在していないケース)と
@listi の値が空リストであるケース、それぞれによって処理を分岐させたいのなら、
この nil.to_a というコードは問題になる

ただ、今回の例(>>344)では両者のケースに対して同じ処理を期待しているように見えるから、
たとえば:
  if (! @list.nil?) && (! @list.empty?)
あるいは:
  unless @list.nil? || @list.empty?
と書くよりも、nil.to_a のほうが好ましいと思う
(よくある言い回し、いわゆる Ruby のイディオムの一つになれる可能性がある)
0353デフォルトの名無しさん2014/08/22(金) 21:34:40.30ID:QtCUYHT3
>>348
JavaやC#にだってぬるぽあるやん
0354デフォルトの名無しさん2014/08/22(金) 23:33:54.15ID:IRypyqt/
非nilであることをinitializeの実装だけでは保証できないのが難しいところだ。
0355デフォルトの名無しさん2014/08/23(土) 00:51:47.76ID:T0CaKeKd
return if @list.blank?
@list.each(&:foo)

じゃないの???
0356デフォルトの名無しさん2014/08/23(土) 01:34:51.41ID:2/26ZChg
@list.try.each{}
が標準でできればなぁ

request for: Object#try
https://bugs.ruby-lang.org/issues/1122
0357デフォルトの名無しさん2014/08/23(土) 02:24:04.01ID:WQrXNI9l
使いたい人は activesupport を使えばいいんだから、別にいいんじゃね?
0358デフォルトの名無しさん2014/08/23(土) 14:44:18.03ID:9MV2WjBq
AIZU ONLINE JUDGEの0021について
以下の回答ではWrong Answerとなってしまうのですが
おかしいor考慮不足な点がなにかわかりません
わかる方ご指摘をお願いしたいです
問題文に記載されたサンプル入出力は満たしています

問題:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0021&;lang=jp
Wrong Answer回答:http://ideone.com/Cl6B6n
回答の内容
2直線の傾き(i,j)を計算し一致すれば
(ただし実数なのでその差が相対誤差(大きいほう*イプシロン)、絶対誤差(イプシロン)より小さければ)
平行と判断する
(イプシロンは1e-10と置く)
0359デフォルトの名無しさん2014/08/23(土) 14:55:59.25ID:WQrXNI9l
>>358
ゼロ除算が考慮されていない
0360デフォルトの名無しさん2014/08/23(土) 15:08:18.23ID:9MV2WjBq
>>359
おう・・・ご指摘通りでした
0除算考慮したらAcceptされました、ありがとうございます!

誤差がおかしいのかとか難しく考えすぎてた・・・
0361デフォルトの名無しさん2014/08/23(土) 16:39:10.31ID:0NcmejrN
a
0362デフォルトの名無しさん2014/08/23(土) 16:47:31.24ID:0NcmejrN
http://imgur.com/UbPYGCx

rbenvでバージョン切り替えが出来ないんだけど、誰かわかる?
rbenv globalコマンドとruby -vコマンドで表示されるバージョンが違うってどゆこと?
バスの設定はしてある。
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
0363デフォルトの名無しさん2014/08/23(土) 17:13:00.67ID:WQrXNI9l
>>362
環境変数 RBENV_VERSION かカレントディレクトリに .ruby-version があるかどっちかじゃね?
0364デフォルトの名無しさん2014/08/23(土) 19:35:20.67ID:1h2qyd6w
rubyから.shを起動させたいのですが、どうすれば起動できますか?
0365デフォルトの名無しさん2014/08/23(土) 20:35:05.17ID:WQrXNI9l
>>364
system
0366デフォルトの名無しさん2014/08/24(日) 00:11:04.95ID:6OMWvQqo
>>365
result =で起動できました!

それと上で起動させたスクリプトを時間がきたら停止させるようにしたいんだけど、
resultで起動させつつその下の命令も実行させるようにってできますか?
■ このスレッドは過去ログ倉庫に格納されています