1 :
デフォルトの名無しさん :
2010/12/11(土) 15:46:15 プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。
関連スレやURLは
>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
3 :
非更新 :2010/12/11(土) 15:48:12
ポニーテール 乙
【バージョンに関するよくある流れ】
Ruby 1.8.5(非安定板)→ Ruby 1.8.6(旧安定版、長期政権)→ Ruby 1.8.7(超お勧め)
Ruby 1.9.0(旧開発版)→ Ruby 1.9.1(旧1.9系列安定版)→ Ruby 1.9.2(1.9系最新安定版)
実のところ、よくできた教科書またはトラブル時に聞き倒せる師匠がいるなら 1.9.2 から入っても特に問題はない
1.9.2ユーザーの場合は「1.9.2使ってます」と断った上で質問してほしい由
【Windows版に関するよくある疑問】
初心者の人はとりあえず ActiveScriptRuby の 1.8.7 使っておけば間違いない(mswin32)
ttp://www.artonx.org/data/asr/ の題字のでかい 「ActiveScriptRuby 1.8.7(pなんとか) with-winsock2 tcl-stub」
マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/ の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」
夢のお告げ等、何かの間違いで Ruby の知識がない初心者時代から 1.9.2 を使いたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.2-p数字 Microsoft Installter Package」
「Windows版Ruby」として紹介されることのある以下の「RubyInstaller」は
これ特有のトラブルの修復知識が必要なので今のところは初心者には勧めない(mingw32)
ttp://rubyinstaller.org/ このトラブルを回避できるようになったら初級者脱出かも
てんぷれおわり
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
9 :
デフォルトの名無しさん :2010/12/11(土) 20:45:54
Chris pine氏のサイトを一通り読んでプログラムを書いた程度のものです。 rubyはweb開発に使われていると聞きます。 出力や入力、関数などについては分かったのですが どうやったらrubyとweb開発を繋げることができるのか分かりません。 rubyとweb開発を繋げて考えるには何をするべきなのですか?
Webサーバーからつくれます
9じゃないけどWebで使えるのってJavaScriptだよね。 どうやってあそこにRubyで書くの?
書けません
>>9 まずは「ruby web開発」でググるところから始めてみては?
いや煽りじゃなく真面目に
>>11 JavaScriptはクライアントで動くものです。
RubyでWebアプリケーション開発、という場合にRubyを使うのはサーバ側です。
それはWebアプリというよりもRIAだから。 そういうことやるための環境が整備されてない言語では無理。 Java FXかAdobe FlexかMicrosoft Silverlight(かMono Moonlight)でやんなさい。
>>8 Webブラウザ === Webサーバ (Apacheなど) === Ruby
1. Web ブラウザが Web サーバにドキュメントを要求する。
2. Web サーバはリクエストされたドキュメントを Web ブラウザに返す。
このとき返すドキュメントは既に用意されていた静的なものでもいいし
Ruby にその場で作らせた動的なものでもいい。
CGI の場合は Web サーバと Ruby は別個のプロセスであり
標準入出力と環境変数で情報をやりとりする。
それだと遅いので Web サーバに Ruby を組み込むこともある。
で、ここまで書いてから Wikipedia の CGI の記事がよさげってことに気づいたってオチ
http://ja.wikipedia.org/wiki/Common_Gateway_Interface
19 :
18 :2010/12/11(土) 21:18:08
アイちゃんにレスしてた…漏れはもうだめだ
ちょいと質問 gem入れるときにコンパイル必要なものがこける linuxだとそういうのを入れるためのコンパイル環境は簡単に入れられる。 (ubuntuならapt-get install buildeessentialとかそういうの) Windowsだと、mingw32版ならdevkitいれればいいよね? mswin32版の場合どうすんの? コンパイル済みのものが別途用意されてる場合もあるけど、 なら最初からgemにプラットフォーム指定していれとけやっていつも思うんだけど
apt-get install build-essential だった
>>16 それってWebアプリなのか・・・
Adobe AIRみたいなものだよな?
JavaFX相当のことはJRubyじゃできないんだっけ?
どうしてもRubyでやりたいというのは「Rubyに慣れてきて何でもRubyでやりたい」という意味以外ない気がするんだが、
AIRのようなRIAなフレームワークならTitanium Desktopというのがある
まだ使われているのは殆ど見ないが
gem パッケージの提供者が現在使用している Ruby に対応したバイナリを提供していない場合、 自分のマシンのコンパイラが走るようになってる gem パッケージ作者がバイナリパッケージを提供していなくて、 自分の使用している Ruby が mswin で、 自分のマシンに VC 6 がインストールされてない場合、その gem パッケージは使用できないだろうね それでもどーしても使いたい場合は コンパイル環境を用意した上で、それでコンパイルされた Ruby をインストールしてないと駄目 実質的に mingw ruby + devkit (または mingw コンパイラ一式別途導入)しか選択肢がないけど… コンパイラがインストールされてない安全に倒した Linux サーバとかでも同じ問題が実は起こる そういう場合、Linux のソフトウェアパッケージで gem パッケージ相当が用意されてたりもする
バイナリ互換性はある migw32 向けに適切にコンパイルされた拡張バイナリは、mswin32 でも使用できる…ということになっている VC6 がないなら MinGW というか GCC でコンパイルしてしまえばいい rubygem は作者が登録しているバイナリパッケージしか探さないので 作者がmswin32名義のバイナリパッケージ(中身はmingw32製)を用意し忘れてた場合 gem install hogehoge という書き方ではインストールできないことがある mswin32 名義のバイナリパッケージ入れてーとgem作者にメールでもするのが一番早い
26 :
20 :2010/12/12(日) 01:12:35
Ruby本スレに丁度同じ話題が出ていたのですね
http://hibari.2ch.net/test/read.cgi/tech/1281473294/693-695 693 名前:デフォルトの名無しさん[sage] 投稿日:2010/12/11(土) 12:25:29
windows用のバイナリがいろいろ出てるけど
それぞれの特徴とか利点欠点教えて
Ruby Install Guide::Microsoft Windows版のビルト環境による違い
に書いてあること以外で
694 名前:デフォルトの名無しさん[sage] 投稿日:2010/12/11(土) 14:46:28
>>693 mswin …
ttp://www.artonx.org/data/asr/ VC6 でコンパイルされたもの、ActiveScriptRuby、メイドインヒゲのオヤジ、配布パッケージは豪華で便利
昔から「Windows版」として扱われてたので、どんな gem でも tips でも Windows 環境だと思ってくれる(mswin32)
VC6 が基本入手不可なので緩やかに終了して mingw にバトンタッチされる予定だったのだが延命中、初心者向け
mingw …
ttp://rubyinstaller.org/ MinGW でコンパイルされたもの、RubyInstaller、世界の選択、配布パッケージは Ruby 本体のみ
数年前から「Windows版」として認知され始めたもの、名前は mingw や mingw32 を返す
RUBY_PLATFORM =~ /mswin/ という古い「Windows環境チェック」記述では false になるという初心者トラップ発生器
devkit で gem ソースを自前コンパイルしたり Windows チェック処理を自力書き換えしたりする必要がまだ時々ある
mswin よりはファイル IO とかが普通速度らしいので上記のライブラリ使用時の障害を自力克服できる中級者向け
cygwin … cygwin 環境でコンパイルされたもの、cygwin 常用者向けのマニアック Ruby
なんでも自分でできる人向けの選択、外野がどうこう言うことではないのでおまえらも文句言うな的な似非上級者向け
27 :
20 :2010/12/12(日) 01:15:38
>>23 さすがにVC6はww
Ubuntuでもインストール直後はコンパイルできませんね
>>25 バイナリ互換性はあるんですね
mswin32名義でも中身はmingw32なんですかw
hoge-1.2.3-x86-mingw32.gem みたいなファイルを直接拾ってきて gem install すると mswin32 でも入るはず gem install --source なんとか でなんとかの部分に mingw32 のを書いても代わりに持ってきてくれるはず
30 :
デフォルトの名無しさん :2010/12/12(日) 15:28:25
変数名を取得する方法はありますか? x=232 def f(func) ... end p f(x) => "x"
何がしたいんだかよくわからないけど。 その f って、たとえば f(1) のように呼び出したら何を返すの?
32 :
デフォルトの名無しさん :2010/12/12(日) 15:57:25
funcって書いたのがまぎらわしいですね。 foo=232 def f(bar) ... end p f(foo) => "foo" f(1)は未定義ということで。
puts (1..4).to_s って、"1..4"と出力されるけど、これって意味あるの? "1234"と返ってきたほうがまだ使い道ありそうだけど、どういう使い方が想定されてます?
34 :
デフォルトの名無しさん :2010/12/12(日) 16:02:08
てか、たしかに関数として書くとわけわかんないですね。 barには232が渡されるだけだから変数名なんて知らないか・・・。 単に foo=232 という定義済みの変数があったとき、 後で "foo" という文字列を取り出したいだけなんですが・・・。
local_variables や global_variables などいかがでしょう
36 :
デフォルトの名無しさん :2010/12/12(日) 16:20:11
>>35 それいただきました。
しかしわりと面倒ですね・・・。
>>33 1..4がRangeだし、俺はto_sで1..4でいいんじゃね?って思うし開発者の意図と一致したけど
何で"1234"がいいと思った?
"1234"が得たいだけなら [*1..4].to_s ででるけど、結果的だしな
>>33-37 それを言うなら、何で[1,2,3,4].to_sは”1234”になるんだよ、"1,2,3,4"じゃないんだよって話にもなる
39 :
デフォルトの名無しさん :2010/12/12(日) 18:13:08
irb(main):001:0> [*1..4].to_s => "[1, 2, 3, 4]" (´・ω・`)
40 :
33 :2010/12/12(日) 18:16:18
いや、得たいわけじゃなく、なんでそうなってるのか疑問だったので。どんな使い方があるのかな?と 得たいだけなら、(1..4).to_a.to_sする
41 :
デフォルトの名無しさん :2010/12/12(日) 18:23:00
>>33 (1..1_000_000_000_000_000_000).to_s とかしてぎっしり詰まったのが返って
きたら泣く。
まぁそれだけならArrayとかも巨大だとそうなるんだけどさ、Rangeは両端
しか保持してないんだし、両端だけが文字列に表れるのは妥当だと思うよ。
>>40 eval したら to_s のレシーバが復元できるからじゃまいか
Ruby の場合他のクラスもそうなのかは知らない
>>42 それは String#dump の「表示されても人間が読めないコントロールコードなどを数値で表示する」機能だな
まあ文字列オブジェクトではないものを display するとはそもそもなんぞやという話はあって、
Ruby では「文字列形式への変換」を to_s が、「人間が読める形式への変換」を inspect が司ってる
んで関数的メソッド puts や print は to_s を、関数的メソッド p は inspect を呼ぶ
そのクラスの製作者が「このクラスのオブジェクトの文字列的表現は○○だ!」と決めたのがto_sで返る
つまりRangeを作った人が考えるところの「Rangeオブジェクトの文字列的表現」が "(初端..終端)" なのだろ
これは inspect も同じだ(p で表示するのもこの形式で充分だと思ったのだろう)
あと Range オブジェクトは
>>41 の言うように両端しか持ってないので、
「途中を具現化」したものはRangeオブジェクトじゃない別のものになるよ
[1,2,3, 5,6, 8] という配列を puts して [1-3, 5, 6, 8] って勝手に省略されてたらムキーだろ
「中身」が欲しい場合はユーザーが手作業で行う
どや顔でそんなこと言われても困るYO
ライブラリのファイル名やGemパッケージ名に関しての標準的なルールを教えてください。 Railsを参考に仕様としましたが、activerecordだったりactive_recordだったりしてよくわかりませんでした。
>>45 gem の名称は基本的にアンダースコアで区切る
active_record が現代的(いや、1語の造語とみなすという運用もあるけどさ)
そして、アンダースコア区切りをキャメルケースしたもの(ActiveRecord)の名前か
アンダースコア区切りから容易に関係性を想定可能で他と被らないような名前の module で全体を包む
require 'active_record' と、アンダースコア区切りの gem 名はそのまま require に書けるようにする
ハイフンで foo-bar-baz と区切ることもあるが、
これは Ruby での Foo::Bar::Baz の対応と近似してることが望ましく、また、
Foo というクラスやライブラリが既にこの世に存在していることが望ましい
net-http-persistent なら Net::
HTTP::Persistent というクラスなりモジュールなりの階層が存在して欲しい
自作のライブラリのクラス構造を gem 名にハイフン区切りで反映することは避けたほうがよい
require 'net/http/persistent' と、ハイフンを / に変えただけで require に書けるようにする
あと、gem 名の中に大文字使う奴は死刑
require するとき大文字で書くべきか小文字のままでいいのか迷うじゃないか
というようなことが
ttp://blog.segment7.net/articles/2010/11/15/how-to-name-gems に書いてあったり書いてなかったりする
自作Matrixクラスに16個の配列をセットする場合、どう書くのがいいですか。 m = MyMatrix.new として (1) m.set [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1] (2) m.set = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1] (3) m.matrix = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1] (1)は他との兼ね合いで×(2)も変だし(3)かなと思うのですがどうでしょうか。
16個の配列でMatrixへの代入ならcolomnsかrowsだろ と思ったがそういう話ではなかった マス目という意味でのマトリックスなのね newになにもないならnewの引数にするのが普通だと思う
49 :
47 :2010/12/13(月) 11:42:33
>>48 後から値を変える場合はどう書くのがスタンダードですか?
mydata[x, y] = new_elem
MyMatrixとやらの中でデータがどう扱われているかによるだろ、そりゃ
>>48 の一行目で結論にならなかったことからして配列の配列が入ってるデータではないんだろうけど
ふつうは「この配列は何のデータか」を考えて、
データ配列ごと引数で指定する方法なのならそれの名前をもつ writer なメソッドにすると思う
mydata.nanika = [16桁]
みたいな
51 :
デフォルトの名無しさん :2010/12/13(月) 11:57:43
16個と書いてあるけど実は1×16でも16×1でもなく4×4の正方行列の意味?
52 :
47 :2010/12/13(月) 12:37:23
いや一般的に代入は「何とか」=ですよね? MyMatrixのように「何とか」が自明でないときは、どうすればいいかという話です。 例えで出しただけなのでrowとかcolumnとか言われても困る。
MyMatrix という名称と配列代入という行為である程度データ構造が自明だと思える人々
>>48 >>50 >>51 MyMatrix という名称や配列代入という行為は一般的過ぎて何も想起されないと思っている人
>>47 という差のような気もする
普通は内部でデータを保持するインスタンス変数と同名のメソッドを使うべきだと思うんだが たぶんインスタンス変数名をどうすればいいですかという質問になりそうな気もするな 既存のデータ系のクラスと同じような動作にしておいて、同じ名前のメソッド使うというのはどう
たぶん配列代入もただの例で、配列には意味がないとか言い出すに一票
56 :
47 :2010/12/13(月) 15:25:47
もういいです。聞くだけ無駄。 ありがとうございました。
要領をえない質問、情報後出しで右往左往、 捨て台詞吐いて逃亡か。最悪だな。
釣られたみなさんご愁傷様
>>46 ActiveRecordのgem名は「activerecord」だから、ちがうんじゃない?
それからそのサイトの説明だと
> If you're adding functionality to another gem use a dash.
とあるから、既存のgemに機能をつけたす場合にダッシュ(ハイフン)を使えとあるから、そう説明しようよ。
Rubyで統計を扱うライブラリの定番は何ですか?
>>60 とくにないです
自分の使い慣れた統計システムのRubyバインディングとか探してください
>>61 なるほど、バインディングですか
これから始めるため使い慣れた統計システムは特に無いので
R使ってやってみます。ありがとう
BaseクラスのメソッドをDeriveクラスで上書きした時にBaseの方の関数を呼ぶにはどうすればいいですか。 d = Derived.new d.hello で基底クラスの方のhelloを呼びたい。
64 :
デフォルトの名無しさん :2010/12/14(火) 01:00:42
定義に先立って別名を付けておく。 class Derived alias base_hello hello def hello; end end Derived.new.base_hello あと、Derivedなんていう用語を使うのはC++くらいじゃね?
d = Derived.new Base.instance_method(:hello).bind(d)[] とか?
66 :
63 :2010/12/14(火) 01:31:01
簡単な方法はないか…C++ならこれで一発なのに d->Base:: hello (); d->Derived:: hello (); どうするか考えます。
FooクラスにFoo#to_sを定義しても puts "Foo = " + foo が、 TypeError: can't convert Foo into String になるのはなぜ。 Stringに変換するために必要なメソッドは?
>>67 to_sを明示的に呼ぶ
Rubyは原則として暗黙の型変換のような振る舞いはしない
puts "Foo = " + foo.to_s
>>67 puts "Foo = " + foo
は
"Foo = " + foo
したものの返り値を puts メソッドに渡してる
"Foo = " + foo
の時点でエラーになるはず
一応、 String#+(other) は other#to_str を呼んでいるので
Foo#to_str を Foo#to_s のエイリアスにでもしておけばいいんだが、
より現実的には
>>68 だと思う
ちなみに "#{うめこみ}" の形式を使用すると to_s の定義だけで用が済む
>>67 は Foo クラスに to_s と to_str の 2つのメソッドを要求してるのだな
irb> class Foo; def to_s; "FOO!"; end; end
irb> puts "Foo.new is #{Foo.new}"
Foo.new is FOO!
71 :
67 :2010/12/14(火) 11:17:32
>>68-70 理解しました。to_sとto_strの2つのメソッドを定義しないといけなかったのですね。
似たような名前の関数を2つ提供するのは微妙だからto_sだけにしておきます。
to_str は「このオブジェクトは String オブジェクトのように扱ってよい」の印 to_s は「このオブジェクトを文字列で表現するとこうなります」の意味 不用意に to_str を定義してはならない to_str の部分でエラーが出ない = このオブジェクトは String 互換 という風に判断されるから obj.kind_of?(String) && obj.to_s のようなもんだと思ってくれ
73 :
デフォルトの名無しさん :2010/12/14(火) 12:34:04
1.9 では Pathname#to_str がなくなって、代わりに to_path が出来てるんだな。
>>73 あのへんはいろいろ揉めたらしいね
to_str 自体が「既存の標準ライブラリに迎合する動作」としての使われ方をしてたから
75 :
デフォルトの名無しさん :2010/12/14(火) 15:37:02
質問です。 Ajax アプリケーションを作成中で、サーバーサイドで Ruby 1.8.7 を使用しています。 クライアントサイドから Get で 〜〜.rb に引数つきでアクセスしようとしています。 (たとえば「〜〜.rb?No=〜&Name=〜」のようなかんじで) しかし、Ruby 側でその引数(No=〜&Name=〜)を取得する方法も、 クライアントサイドに値を返す方法(クライアントで .responseText で取得するやつ)もわかりません。 どうやったらよろしいでしょうか? 馬鹿馬鹿しい質問なのだとは思いますが、教えてください。お願いします。
>>75 そもそも現状の Ajax アプリケーションは Web アプリケーションの最終進化形態のひとつだ
(まあ、いろんな意味で)
サーバサイドとクライアントサイドと通信手段の基礎となる知識をすべて吸収した上で応用するという形になる
CGI 作ったことがないなら、たぶん無理だと思う
素直に Ajax 連携に定評のある他の言語使ったほうがいいんじゃないかな
Railsスレで聞けば別の回答が返ってくる説に一票
78 :
デフォルトの名無しさん :2010/12/14(火) 16:54:00
>>76 そうですか…そんなにハードルの高いことだったのですね…。
かなり軽く考えていたかも知れません…。
しかし、心からの親切心でそう言っていただいていると思うので
大変恐縮なのですが、私にも事情があり、どうしても諦めるわけにはいかないのです。
ほんとうにありがとうございます。
>>77 そうなんですね。
しかし今から全く未経験の Rails に手を出す余裕は無いのです。
どうもありがとうございます。
Rubyでやらないほうが早いって言われてるのに
80 :
デフォルトの名無しさん :2010/12/14(火) 17:34:50
>>79 誤解させてすみません。
どうしても Ruby を使わなければならないのです。
自分もできたら他言語でやりたいっす…。
CGIだったら環境変数。Ruby関係ないよ
>>80 迷える子羊のために三択を用意した
1. Ruby標準添付のCGIモジュールについて調べる
でもってローカルにApacheでも立ててクエリ文字列とPOSTの内容と
環境変数をダンプできるCGIを作って動作するところまで頑張る
そこまでいければなんとかなる
2. 諦める
さあ選んでくれ
第三の選択肢は↓
中途半端な知識でAJAXなんて脆弱性垂れ流すに決まってる ちょっと考え直した方がいい
85 :
子羊 :2010/12/14(火) 19:01:23
>>82 「1.」の一択でお願いします。早速学習を始めます。
いちおう Apache はローカルにインストールしてますが、Apache に関する知識は皆無です。
環境が Windows でブラウザで
「
http://コンピュータ名/htdocsフォルダに置いてあるファイル名 」という
アドレスにアクセスすることでそのサイトにアクセスできる状態にしています。
それで参考にお聞きしておきたいのですが、
「クエリ文字列とPOSTの内容と〜〜動作するところまで頑張る」という部分は
CGI モジュールについて学習すれば理解・実現できる内容ですか?
それとも Apache に関する書籍なども購入して学習する必要がありますか?
ほんとうにありがとうございます、救われた思いです。
とりあえず CGI モジュールについて学習します。一生懸命頑張ります。
Ruby案件可ってことにして受注しちゃったのか?
>>86 ていうかプログラミングに対する知識と経験が絶望的に足りないと思われ
「ふつう」の知識と経験があるなら
>>75 の場所では詰まらないと思うの
Ajax とは、みたいな説明や適当な Ajax の解説やサンプルを読んである程度理解したなら
Ajax として目新しいところとそうでないところの判断くらいはついて欲しい
つまりはこの人「何も作ったことがない」んだと思うよ
運転経験ない人に長距離夜行トラックでの運送なんて任せられるかw
素直に単純な CGI とかの日曜の自家用車ドライブからはじめろw
HTMLの勉強をする CGIの勉強をする(Rubyで) HTTPの勉強をする JavaScriptの勉強をする Ajaxの勉強をする(Rubyで) こんな順番?
HTML の勉強をする CGI 無関係な Ruby の勉強をする Apache の基本的な使い方を学ぶ CGI の勉強をする(Ruby で) HTTP の勉強をする JavaScript の勉強をする Ajax の勉強をする(Ruby で) こうだろ …なんかめんどくさいな、どうせ表示するデータの取り扱いでも挫折するんだろうし、最初から Rails にするか なんか、動作が遅いですとか言われそうな気もするが でも、Rails が本番サーバで動作するかどうかのチェックも要るな 安価なレンタルサーバだとまともに動かなかったりするし
90 :
デフォルトの名無しさん :2010/12/14(火) 20:45:55
なんか悲しい流れになってきたな。しゃあない面も大きいとは言え…。
よその会社に丸投げで発注したほうがいいと思う
92 :
デフォルトの名無しさん :2010/12/14(火) 20:50:42
>>89 HTMLに関しては何がわかってないの?この人
そこそこに「わかってる」なら適宜飛ばしていいだろそりゃ
単に要素を列記しただけだと思うぞ
>>90 そもそも「カンタンにWebアプリを作成!」というのが幻想というか妄想なので…
情報商材みたいなもん
というか質問は * クエリ文字列の取得 * XMLHttpRequest#responseTextの取得 これだけなのになんでここまで盛り上がれるのん 後者はRuby関係ないからスルーとして 前者はcgi.params, cgi.query_string, ENV['QUERY_STRING'] その他フレームワークの類似機能を使用する、で終了じゃない
悲しげなフレーバーを嗅ぎ取ったから
>>75 ほかの人のアドバイスと被る部分もあるが
まずは、Rubyで簡単なCGIスクリプトを作るといい
内容はHelloWorldレベル(簡単なメッセージ表示くらい)で十分だ
作り方は検索したらいくらでも出てくるし、
>>94 のアドバイスも参考になる
ブラウザ上からそのCGIスクリプトにアクセスして、画面表示ができたら
AjaxでそのCGIスクリプトにアクセスして
CGIの出力を持ってくる(JavaScript側で出力を受け取る)ところまでやる
ここまでできれば、後は応用でなんとかなると思う
どう考えても仕事じゃないだろ あとrails勉強した方が結果的には最短距離かと
Rubyやってる人が最短でできるのがrailsってイメージが自分はあったけど、 最近(っても古いか)の騒ぎ立てでRails使わないのにRubyやってんの?ってのが嫌。
Railsを使わないRubyのWebアプリってやっぱイマイチなの? CGI部分もあまり出来が良くないって聞くよね 素直にPHPでやったほうがいいのかな
cgi.rb使うぐらいならsinatra使った方がいいよ と話をややこしくしてみる
>>99 Rubyで書けます
これがメリットだと感じないならRubyでWebアプリケーション作るのやめたほうがよい
いやかなりマジで
>>75 >>82 にはSinatraに一票入れたいところだが、次に
>>75 は
レンタルサーバーでSinatraが動きません
(もしくはめちゃめちゃ遅いです、使い物になりません)
と言ってくるので、cgi.rbでよいと思う。
103 :
102 :2010/12/15(水) 01:47:30
前スレでirbで落ちると言っている人いたよね? rbreadline.rbを使っているRuby使っている人かもしれない。 readlineがライセンスの問題があるためRubyでreadlineを実装しようとしているもののようだけど、 Windowsでは日本語が入力できなかったり、行を編集しようとすると遅かったりどうにかすると落ちたりするなこれは pikでRuby 1.9を入れるとrbreadlineが標準添付されたRubyが入るのだが、これだと実質irbが使えないな
ActiveScriptRubyのバージョンを1.8.7から1.9.2に上げたら、 irb上で上下カーソルの入力履歴がでなくなりました。 これないとめっちゃ不便なんだけど、どしたらよいの?
rlwrapを入れる
>>106 ありがとうございます。
これは大変良さげなのですが、Windows用バイナリは何処に?
cygwin入れてコンパイルするしかないかな。
Sinatraってデプロイとか簡単?
>>109 デプロイだけならHerokuは簡単
ただし動作環境にクセがある。
動作環境が満たされるなら遊びのちょっとしたものなら無料の範囲で作れるし、
そうでないなら金払えるなら、サーバー管理の手間かからないしいいんじゃね?
Google App Engineもデプロイだけは簡単だけど死ぬ
VPSでの動作ならRails並に簡単、いつもの慣れた環境をつくってデプロイできる。
え?・・・このレスに有益な情報がないって?
112 :
デフォルトの名無しさん :2010/12/15(水) 10:52:13
>>75 です。
みなさん、たくさんの親切なアドバイス、ほんとうにありがとうございます。
みなさまからいただいたアドバイスを参考に学習・開発を進めてまいります。
>>87 おおむね、おっしゃるとおりでございます。
Web アプリケーションの作成は今回が初めてでわからないことだらけです。
>>96 も仰ってあったとおりまずは素直に単純なところから始めようと思います。
ご親切にありがとうございます。
>>88 >>89 参考になります。
>>93 のおっしゃるとおり、
その中からわかってない部分を適宜拾い集めて学習させていただきます。
ありがとうございます。
>>94 ありがとうございます。
お陰さまで何とかなりそうな気がしてきました。
参考にして調べてみます。
>>96 まず単純なことから試してみます。
基本ですよね、視野が狭くなって忘れていました。
親切なアドバイスが身にしみました、ありがとうございます。
さくらVPSとかカゴヤ・クラウド/VPSとは月1000円もしないんだからそっちで
WPFでこのように”1行”で書いたコードを
Rubyならどうやって書くの?
<WebBrowser Source="
http:... "/>
重複だからどうなんだ? 回答がないし、スレ落ちてるから質問しているんだが それがだめな理由でもあるのか?
C#は知っててもWPF知ってる人がいないから回答がこないんじゃね あきらめれ
ていうか処理層違ってどうにもならんし話も膨らまんからガチスルーされたのだろ 回路図示して、Rubyで炊飯器のタイマー起動するにはどうすればいいですかみたいな話に近い
なかなかうまいことを言う
WPFで1行でできることがRUBYだとできないの? WEBに強いんでしょ?
そんなこと言われましてもIEがWPF/XBAPを解釈して実行しているものをどうしろと
PHPのほうがよりWEBに強いと思いますのでPHPの人に同じように質問して、 嫌われるといいと思います。
WPF + MSBuild + Silverlight vs. Chrome OS + Native Client + Go 世田谷区民会館ぐらいなら埋まりそうなカードだな
124 :
デフォルトの名無しさん :2010/12/15(水) 15:19:59
>>120 勝手にWEBに強いことにしないで欲しいな。
じゃあもっと簡単なところで <Button/> たったこの1行でボタンが配置できますが Rubyだとどうするんですか?
>>125 InternetExplorerが公式にRubyをサポートしてからまたおいで
あなたはクライアントとサーバサイドの区別がついていない
バカは放置すべき
128 :
デフォルトの名無しさん :2010/12/15(水) 15:33:31
幼稚園児の屁理屈みたいで 見てて微笑ましかったのだが
>>125 再現してみるからLinuxで動くコードちょうだい
前スレから出没してるアレな人でしょ どうにかしてRubyを馬鹿にして悦に浸って苦しい日常生活から現実逃避したい低レベルなプログラマさん kill myselfをお勧めします
バカは放置すべき
コードで示せないあなたたちがバカではなくて?
しかしみんな構っちゃうw
Rubyなら print "<Button/>" でいいんじゃないの?
XAMLだね 静的にコンパイルするとb = Button.newみたいなコードが得られる 動的にロードするのならIronRubyでも出きるだろう
こんな動作をRubyで一行でできる? Array.ForEach(files,f=>Console.WriteLine(f));
できるって言ったらなんなんだろうね できてないって言って追っ払っちゃおうか 面倒だし
やめろおいそれはRubyの得意分野だ
>>138 できません
あなたの勝ちです
では他の人次の質問どうぞ
そういや、Ruby1.9.1 系統の open-uri は open の引数に文字エンコーディング情報をくっつけると
その値に force_encoding して返してくれるぞ、という話を前スレでしようと思ってたらスレが終わってた
irb1.9> p open("
http://www.2ch.net/ ").read.encoding
#<Encoding:ASCII-8BIT>
irb1.9> p open("
http://www.2ch.net/ ", 'r:Windows-31J').read.encoding
#<Encoding:Windows-31J>
force_encodingはエンコード情報だけを強引に書き換えるメソッドなのだが
中身が EUC で、force_encoding 'UTF-8' しただけじゃまずいわな。
そもそも前スレでどんな話してたかを知らないと頓珍漢なレスに
> それは Net::HTTP の仕事ではないというかそんな根底部分で余計なことすんなということらしい
> open-uri ならヘッダの Content-Type を読んで force_encoding で設定してくれるが、
>
> irb1.9> require 'open-uri'
> irb1.9> p open("
http://dailynews.yahoo.co.jp/ ").read.encoding
> #<Encoding:EUC-JP>
> irb1.9> p open("
http://sankei.jp.msn.com/ ").read.encoding
> #<Encoding:Shift_JIS>
> irb1.9> p RUBY_VERSION
> "1.9.2"
>
> レスポンスヘッダの Content-Type ほど信用ならないものもないのでまあ掛け捨て保険程度
2次元の範囲ってどう指定してますか。 例えば2次元画像の特定の領域(x,y,width,height)を指定するのに こう書くのは問題ですか。他にもっといい書き方があれば教えてください。 image.pixels[x,y,width,height] = pixels
image.pixels[x1,y1,x2,y2] = pixels そんな書き方してたら座標変換するとき面倒だろ
>>148 あ、いやそれは問題にしてなくて例えば
pixels[x..x+width, y..y+height]
pixels[[x,y], [width,height]]
pixels[x,y][width,height]
みたいな書き方の方が良いのかなという話です。誤解させてすみません
何でpixelの中にpixelsを格納するのか意味不明 colorならわかるが
image内の矩形領域に別の矩形領域pixelsをコピーしてるんじゃないか?
>>146 うん、Content-Type ヘッダの charset を ASCII-8BIT の代わりにセットする代わりに
引数指定の文字エンコーディング名をセットするようにできます、という話だよね
>>151 あのコードがそのように解釈できるのか?
どうみても、1pixelに複数pixelを割り当てているようにしか見えないが
CopyRect(Rect srcImage,Rect destImage)
とかにすべきだろ
image.pixels[x,y,width,height] = pixels 左辺は範囲じゃん ary[start,length] = ary2の二次元版
ぐぬぬ…
でもstart, lengthはともかく4つ使ってstart(x), start(y), length(x), length(y)は一般的かな?
一般的だろ
気持ち悪い言語だなぁ
>>145 この場合はforce_encodingが正しい
Encoding が BINARY なものに force_encoding で「名前をつける」ことの何が非難対象なのかがわからないな Encoding は nil が許されないから、必ず何らかの名前がついている 文字エンコーディングを特定できない、または特定しないという印が ASCII-8BIT こと BINARY ネット経由のファイル取得でエンコーディングを特定できる情報がないから ASCII-8BIT だったものに force_encoding を使って人間が知ってる情報で名づけてあげることの何がまずいというのか
161 :
デフォルトの名無しさん :2010/12/16(木) 11:39:38
>>75 です。
時間はかかりましたが、やりたかったことができました。
余計かな、とは思いましたがみなさんのご協力がなければ
間違いなく先に進めていなかったので、ご報告させていただきます。
本当に助かりました。ありがとうございました。
3Dゲームを作りたいのですが どうすればできますか?
スルー推奨
>>162 そういう話題ならマジレスするぜ。
ウィンドウ作成とキー入力、サウンドはqtrubyを使うのが一番簡単。
あとはOpenGLを使ってごりごり書く。
3Dシューティングゲームならこれで作れる(実際に作った)。
ただしそこからPS2レベルのゲームを作るにはかなり努力しないといけない。
表示だけ考えても、そこからモデルのロードとスキニング、アニメーションを自前で実装する必要がある。
これらを実装するのはそれなりに知識と時間が必要。
なので今ちょうどそれらを全部含んだM3Gという携帯電話で使われている3D描画APIを実装して
Rubyから使えるようにしている作業の真っ最中。
もう動いてるけど、さすがにまったく知識のない人間には勧められる完成度はない。
とりあえずOpenGLを使って簡単なゲームを作ってみるべし。
ちなみにモデルビュアーのスクリーンショット。これが100%Rubyで書かれている。
この画像ではわからないけどちゃんとアニメーションしている。
http://www.gazo.cc/up/21983.png
スルー推奨
>>164 おい、スルーし・・・
ちょw
特定しますた
しかし3Dゲーム作るなら、ゲームエンジンのバインディング作ったほ(ry
>>164 のぞかせてもらった。
M3GのAPIの互換実装をつくって、別にRubyのバインディングを作ってるのか。
M3Gって需要あるんかいな
3DゲーなのにDirectX使わないの?しょぼ
rubysdl + OpenGL のサンプル試してみたけど PSレベルのものは作れそうだ
Rubyのブロックってもしかして、 「公開関数が2つ以上関数を引数にとるなんてことめったにねぇよ」 って発想が根底にある?
×公開関数 ○高階関数
>>172 たしかそんなような話は聞いたことがある
>>172-174 MLかどっかのログくれ!!
俺もブロック見たときびっくりした。何で1個なんだよって。
でも意外にif else end (ブロック2つみたいなもの)のようなものを作ることがなくて困らない、
というかそういう作り方になってしまう。
どうしてもやりたければlambdaでいい。
1個の場合は楽。バランスなのかも
本人が「失敗だった、高階関数を一つ限定にしたのが自分の限界」 みたいなことを言ってた記事を見たことあるが、 なんでもかんでも未来を見通せるわけじゃない。 高階関数を組み入れただけでもすばらしいよ。
初心者スレだったな Rubyだとたとえば「ブロックが1個限定なのってよく考えたら変じゃね?」という話 def foo(arg1, arg2, &block) end と定義して foo(111,222){|x| ... } と利用するわけだけど、これって def foo(arg1, arg2, &block1, &block2) end と定義して、現行のRuby文法上ではうまく書けないんだがなんか foo(111,222){|x| ... }{|y| ... } みたいに複数ブロック実行できるようにしたとしても別にデメリットはないんじゃね、 複数引数自体は自然だし、いざという時用に用意しててもよくね? という話
>>178 でたでた、良くある初心者ならこれくらいなら理解できるだろうという上から目線。
そもそも高階関数そのものがわからないのに解説して貰ってもねぇ-
高階関数 defで設定した関数の中で関数を呼ぶもの。 これが1個 def f(g,a) g.call(g.call(a)) end これが2個 def f(g,a) g.call(g.call(g.call(a))) end
高階関数とはなにか
Rubyで高階関数を実現するには
lambda, Procとブロックの関係
>>176 の真偽も含めて
今日のRuby初心者スレは盛りだくさんだな
時間帯まとめてレスがつくのが興味深い まるで一人で書いているかのようだ
class Foo def bar(obj=nil) obj.foo end private def foo puts "foo" end end Foo.new.bar(Foo.new)
多分ここ見ているの3人ぐらいJane?
>>182 プログラマは以外と規則正しい生活をしてるってことだな
何が悲しくて初心者スレにプログラマが常駐せねばならんのだ
protectedがJavaとかのそれと違うと言われるのは、どんなところがちがうの?
190 :
デフォルトの名無しさん :2010/12/17(金) 19:05:01
A#fooがprotectedで、a1、a2がAのインスタンスだとすると、 a1.foo #=> エラー a1.instance_eval { foo; self.foo; a1.foo; a2.foo } #=> いずれも可能 fooは、A(とそのサブクラス)のインスタンスのコンテキストで使える。 privateと比較すると、selfに加えて、自クラス・サブクラスの他の インスタンスのfooが呼べるってこと。 比較判定で他の兄弟インスタンスの属性を参照するメソッドなどがprotectedになりうる。 Javaのprotectedは、コンテキスト関係なく、サブクラスのインスタンスに 対して使用できるかどうかを示す。
public 呼び出しの場所も形式も制限なし private 呼び出しの場所の制限はないが、形式に制限あり レシーバつきだと呼び出せない protected 呼び出しの場所に制限があるが、形式には制限なし 所属クラスか継承クラスの def ... end の中以外では普通はエラー class C def priv; end def prot; end private :priv protected :prot def check_priv(c=nil) priv rescue warn "cannot priv" self.priv rescue warn "cannot self.priv" (c.priv if c) rescue warn "cannot c.priv" end def check_prot(c=nil) prot rescue warn "cannot prot" self.prot rescue warn "cannot self.prot" (c.prot if c) rescue warn "cannot c.prot" end end irb> C.new.check_priv(C.new) cannot self.priv cannot c.priv irb> C.new.check_prot(C.new) irb>
仕事でストレス溜め込んでるから、初心者相手に憂さ晴らししているプログラマが多いって証だろ。 ちゃんとカウンセラ常駐の、大手ソフト会社は、メンタルケアを行う事でストレスによる休職や離職が5年前は7%だったのが、昨年は0.7%に減少し、年間2億円のプラス効果が出たとかw この会社は当然新卒にも大人気らしい。
>>190 >比較判定で他の兄弟インスタンスの属性を参照するメソッドなどがprotectedになりうる。
というかそれしかないんよね
自分か仲間のオブジェクトをメソッド内に連れ込んだ場合に限ってそいつが喋れるってどんだけ秘密なの
ちなみにどれも __send__ で呼び出すことは可能なので、あんまり防御効果はない
protectedてC++で言うprivateに使いのか?
同名のローカル変数とprivateメソッドが同一クラスにあった場合、同クラス内からprivateメソッドを呼び出す方法ってある? evalとかの魔術的な方法ではなく正攻法で。 class C def hoge fuga = 0 # fugaメソッドを呼び出すには? fuga end private def fuga "fuga" end end puts C.new.hoge
__send__(:fuga)
いや、それ十分魔術だから
スーパークラスからじゃなく 同じクラス内で同じメソッド名を作っておく意味ってあるの?
ホントに動くねw class C def hoge fuga = 0 # fugaメソッドを呼び出すには? __send__(:fuga) end private def fuga "fuga private" end end puts C.new.hoge
>>198 いわゆる、ローカル変数名がたまたま被るという話だろう
それでいてローカル変数の名称も変更できずメソッド名も変更できずロジックの変更もできない
という特殊環境下でたかだか __send__ を魔術と抜かすんだからどうにもならん
201 :
デフォルトの名無しさん :2010/12/18(土) 00:13:26
>>193 だから、「たいていのprotectedの使い方は間違い」だと疑ったほうが
いいんだよね。RailsとかRailsとか。
間違った使い方のほうがruby本体より有名に成ったからなあ。
どこから「だから」がきてるのかさっぱりわからん
send は別に魔術でもなんでもないよね メソッドを確実に呼ぶだけだ ただまあちょっとばかし可視性とか無視してるが
アクセス権限をかいくぐることがsendの主目的かよw
昔なんか裏技とか言ってゲームやってたようなおっさんたちが嬉々として「裏技」に仕立て上げているという悲惨なメソッド
実際はsendってどんな時に使うものなの?
send は Object に定義されてて、ありがちな名前が被る可能性があるので実質 __send__ を使う
で、
>>204 の通りだろ
呼び出し制限に影響されないというのが差異で、単なるメソッド呼び出し
本来は、private メソッドを無理矢理使うときー、みたいな限定用途ではない
209 :
デフォルトの名無しさん :2010/12/18(土) 13:31:52
「文字列で名前で指定されたメソッドを呼ぶ」とかな。 別にアクセス制限は関係ない。
普通は動的プログラミングで使うだろ privateメソッドにアクセスする用途で使ったのなんて モンキーパッチで仕方なく書いた1回だけだ
なのでやっぱり魔術的
呼び出し制限に影響されずにメソッド呼ぶとか、動的プログラミングとか と privateメソッドを呼ぶ の違いが初心者の私にはわかりません。 前者はほかに何ができることを言っているのでしょうか?
呼び出し制限に影響されずにメソッド呼ぶ privateメソッドを呼ぶ と 動的プログラミング というくくりで考えればいい。 上二つの違いは、何が目的なのかという解釈の違い。 二つのくくりの違いは、もう何もかも違うだろ。
まあ、他の2つは試せばわかるとして、動的プログラミングのくだりはたとえばこんな感じなんじゃないかと class C def foo; puts "foo"; end def bar; puts "bar"; end def baz; puts "baz"; end def main(arr) arr.each do |name| __send__(name) end end end C.new.main(['foo', 'baz', 'foo']) ・ 「なんかスゴいからこれどっかで使おう!」とか考えない ・ 手段のために目的探したりしない、乱用厳禁 ・ どうしても困ったときにはたぶんあなたの前に現れてくれるサンタさん
なるほど、わかったきがします 説明&例をあげていただいて感謝
216 :
デフォルトの名無しさん :2010/12/18(土) 23:30:23
class C def foo; puts "foo2"; end def bar; puts "bar2"; end def baz; puts "baz2"; end def main(arr) arr.each do |name| __send__(name) end end end C.new.main(['foo', 'baz', 'foo']) 引数から直接関数を呼ぶって危険じゃないの? これがrubyスタイル?
・ 「なんかスゴいからこれどっかで使おう!」とか考えない ・ 手段のために目的探したりしない、乱用厳禁 ・ どうしても困ったときにはたぶんあなたの前に現れてくれるサンタさん って書いてあるじゃん。もう少し考えてから書こうよ。いくら2chと言ってもさ。
そもそもrubyインタプリタへのアクセスを許してる時点で危険も何もねえ
Rubyは開発者のことを信頼しているっていう思想が根源にあるから そんくらいで危険とか言われてもピンと来ないな
__send__ はどう頑張ってもメソッドしか呼べないので $SAFE=1 で禁止されないな まあそんなもんだと思う __send__ に渡す引数が信用ならないなら自前でなんとかしてくれ
>>220 >Rubyは開発者のことを信頼しているっていう思想が根源にあるから
C みたいな言い分ですね
まあ一般的にはそうだ
以下のような違い(疑問)に出会ったときに、ArrayクラスのArray#==メソッドの実装部分を調べるとObjectとの違いの理由がわかったりすると思うのですが、Array#==(やObject#==)の実装部分(Rubyコード?)を実際に見るにはどこを探せばよいのでしょうか? a = Object.new b = Object.new p a == b #=> false a = Array.new b = Array.new p a == b #=> true
コンパイル前のC言語ソースのarray.c
>>228 Oh.. Cを読まないとダメですか 自分にはまだちょっと早そうですね〜
リファレンスの文章で我慢します
レスありがとうございました
231 :
227 :2010/12/19(日) 21:23:50
>>230 おお、これはわかりやすいですね!
これなら自分でもObject#==とArray#==のCコードを見ることができました
Object#==のほうは短いのでなんとなくわかりますが、Arrayのほうはよくわからずw でも実装が違うってことはわかりました
参考になるサイトを教えていただきありがとうございました
232 :
デフォルトの名無しさん :2010/12/20(月) 00:34:51
たいていクラス実装コードの最後に、いかにもなrb_define_classとか rb_define_methodとかあるから、そこでRubyレベルのメソッド名を探す と、対応するCの関数が分かる。
2004年に既に1.9系ってあったんだな まるで普及してない・・・
ついでに質問だけど、1.9.1が安定版なら、1.9.2は開発版? で1.9.3が安定版?
>>6 の通りなんだが、そういや命名規則の話が抜けてるな
1.9 系列の開発版は常に1.9.0を名乗り、バージョンが「上がる」ことはない
1.9 系列の安定版は 1.9.1、1.9.2、1.9.3、… 1.9.10、1.9.11、…を名乗る
1.8 系列の開発版は…あるんだっけ? まあいいや、1.8.7 の次の安定版は、あるとしたら 1.8.8 だ
2.0 が安易に出ることはしばらくない
1.9 の安定版でもう何も足すことも引くこともないというような安定っぷりになったら、
それがそのまま2.0にスライドすると予測されてる
1.9.1/1.9.2がお勧めになってないのは ・ それはRubyの書き方のミスです ・ それはRubyの使い方がまずいです ・ それはgemライブラリ側の不具合です ・ それはgemライブラリが1.9.1に対応してないからです ・ それはあなたの文字エンコーディングの扱い方のミスです が渾然一体となってジェットストリームアタックかけてくるからだな 1.8.7でRubyに慣れてからだと > それはRubyの書き方のミスです > それはRubyの使い方がまずいです が激減して > それはgemライブラリが1.9.1に対応してないからです の自力バイパスが可能で > それはgemライブラリ側の不具合です を自力修復可能(なことがある)なので、残りの > それはあなたの文字エンコーディングの扱い方のミスです とせいぜい ・ それは1.9.1/1.9.2の新機能です くらいで悩む程度になって気楽
いつの話だよw2年前か?
日常的に1.9.1や1.9.2を使って「いろいろな」gemを扱ってれば わりとピキッと来ることが多いはずなんだけど
日常的に使ってるが今やそんなことはほとんどないなあ 例えばどんなgemか3つ4つ挙げてみてよ
そういや最近の新しいのはないな 文字エンコーディングが変なのは時々ひっかかるけど
なんだかんだいってrailsだよりだからいまさら
ライブラリの更新履歴見ると「1.9関連かよ!」と思うことはないでもない
247 :
デフォルトの名無しさん :2010/12/20(月) 12:32:00
#!/usr/bin/ruby -Ku # -*- encoding: UTF-8 -*- require 'rubygems' require 'active_support' require 'date' p Date::today p Date::today.last_month このスクリプトで,test.rb:10: undefined method `last_month' for #<Date: 4911101/2,0,2299161> (NoMethodError) のエラーが出てしまいます。 対処法知ってますか? 環境は,intel iMac 10.6.5 ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] ruby 1.8.6 (2009-06-08 patchlevel 369) [universal-darwin9.0]のppc miniでは問題なかったのですが。
248 :
デフォルトの名無しさん :2010/12/20(月) 13:24:57
動かないほう、Rails 3が入っていないか? last_monthのかわりにprev_monthを使用すべし。
>>239 rubyのバージョンの数字が2桁にならない保証ってもう過去の話?
250 :
デフォルトの名無しさん :2010/12/20(月) 17:39:07
日常的に使ってない初心者な俺は
amazon-ecs(+Hprocit)で
>>240 みたいな目にあった
class Foo def << name, price puts "#{name}=#{price}" end end foo = Foo.new foo << "smile", 100 エラーが出ます。なぜですか? ./main.rb:10: syntax error, unexpected ',', expecting $end
説明不足なので補足。 foo << ["smile", 100] foo.<< "smile", 100 という書き方をするメソッド定義はわかるのですが、 foo << "smile", 100 という書き方をするためのメソッド定義が分かりません。
<<とか一部のメソッド名は2項演算子の形式をとるから。
254 :
251 :2010/12/20(月) 21:06:25
何とかなりませんか? メニューに"smile"、100円を足す正しいメソッドは mac.menu << "smile", 100 だと思うのですが、どう考えてもこの表記では書けません。
255 :
デフォルトの名無しさん :2010/12/20(月) 21:16:54
構文の問題なので、なんともなりません。
へー、こんな制限があるんだ 知らなかった
257 :
デフォルトの名無しさん :2010/12/21(火) 00:16:43
DSLにかぶれると menu :mac do item 'smile', 100 item 'potato', 50 end とか書いてしまいそうだ。
PostgreSQLを使おうとpgを使っているのですが、SELECT ary FROM tableの結果 aryだけを配列としたいのですが、昔はPGResult.resultっていうのがあったみたいなんですが 今はないみたいで PGResult.each do ふにゃらら endでやっているのですが、 これで正しいのでしょうか? なにか釈然としません。
ふが ふが ふが
>>254 すでに回答があるように、言語使用上不可能。演算子はそういうもんだと思ってくれ。
回避策は、気に入ってもらえるかわかんないけど
mac.menu << "smile", 100
ではななくて
mac.menu "smile", 100
にするくらいしかない。
def menu(name=nil, price=nil)
# 引数が指定されていれば追加する
@menu << [name, price] unless name.nil?
# メニューを返す
@menu
end
または
def menu(*args)
# 引数が指定されていれば追加する
@menu << args unless args.empty?
# メニューを返す
@menu
end
プログラム的な話ではないのですが、Rubyについて質問させてください。 よくRuby(Rails)が使用されている代表的なWebサービスとして、 Twitterが挙げられますが、以前はすべてRubyで書かれていたけど、 最近はフロントエンドがRubyで、バックエンドがScalaだと聞きます。 この場合のフロントエンド、バックエンドというのはどの部分を指すのでしょうか? 素人考えにはフロントエンドがUI、バックエンドがDBかなぁとか想像してますが、 そんな分け方するのかな?と疑問に思いました
262 :
247 :2010/12/21(火) 11:43:51
>>248 ありがとうございます。おっしゃるとおり,Rails3が入ってます。
gem list -l
actionmailer (3.0.1, 2.3.5, 1.3.6)
actionpack (3.0.1, 2.3.5, 1.13.6)
actionwebservice (1.2.6)
activemodel (3.0.1)
activerecord (3.0.1, 2.3.5, 1.15.6)
activeresource (3.0.1, 2.3.5)
activesupport (3.0.1, 3.0.0, 2.3.5, 1.4.4)
rails (3.0.1, 2.3.5, 1.2.6)
ただp Date::today.prev_monthと変更しても,
undefined method `prev_month' for #<Date: 4911103/2,0,2299161> (NoMethodError)
になります。
パッチレベルが低いからでしょうか?
システムデフォルトのとは別にrubyをインスコすべきか,悩みます。
とりあえず,お礼とご報告まで。
>>262 rvm入れてgem環境分けておけばいいよ
Rails3が原因なら外しておける
264 :
デフォルトの名無しさん :2010/12/21(火) 14:04:33
古い時代にprevとlastの両方があったわけじゃないので、 使っているActiveSupportのバージョンに応じてprevとlast使い分けて くだされ。 2.3.8 は移行を意図しているので両方あるはずだけど。
こんな流れの中質問するのも申し訳ないんだけど、 公式リファレンスのEnumerable#max {|a, b| ... }の説明でめちゃくちゃ混乱してるんだ なぜブロックのパラメータはふたつ?とか 「ブロックの値は〜期待してます。」の意味とか 全然理解できない 誰か使い方を教えてください
foo が Enumerable だったとして foo.max は foo.max{|a,b|a<=>b} と同じ 比較のための値の計算の方法じゃなくて、大小比較の方法をブロックで外付けしてやるわけ。
>>265 1. 数値の配列を sort メソッドを使わずに自力でソートするプログラムを書く
2. 1 を拡張して任意のオブジェクトの配列をソートするプログラムを書く
ここらへんまでやれば、たとえ 1 と 2 がうまく書けなかったとしても
max やら sort みたいに比較関数を渡すメソッドの使い方ぐらいは理解できるはず
268 :
265 :2010/12/21(火) 18:54:51
>>266 比較方法をブロック内に書くのか
全然気づきませんでした。ありがとう。
>>267 あとでやってみます
まあだいたいはスレ違い Rubyに絡めてくれれば乗る人もいたんだろうけど…
>>270 そうですかー
>>261 が理解出来たら、じゃあなんでRubyじゃダメだったのか、単に速度が遅かったからか、大量のつぶやきをさばけなかったのか、もしくは動的型によるリファクタのしづらさとか、それとももっと違う原因なのか、という部分も知りたいと思ってました
ここじゃスレ違いだとすると、どこで聞くのが適切でしょうか?
272 :
デフォルトの名無しさん :2010/12/21(火) 21:52:14
HTTPでクライアントに応対する部分がフロントで、 DBやファイルや他のデーモン・サービスと連携する部分がバック だと思えばいいんじゃないかね。
基本RubyとRailsはCPUコストやメモリコストが他のスクリプト言語や他のコンパイル済み言語よりも高い これは単純に(ある程度の)足し算というレベルで高い ごっつい処理をたくさんの人に提供、とかいうのだと、最終的にPHPのほうが最低2倍は捌ける人数多いと思う でも、それでもRubyを使う人がいる この世のあらゆるプログラムをCで記述しないのと同じような理屈 Rubyで初期開発して、処理負荷が間に合わなくなったら他の言語に移る、というのは Ruby的にはまったく悲しむべき問題ですらない むしろRubyの優位性を示す出来事であるとすら思う人が多いはず 公開プロダクトを最初から最後までRubyで運用し倒しましたとかいうのは その人がお金持ちか基地外か過疎プロダクトかどれか
>>273 matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
Ruby(onRails)を高速化すれば戻って来てもらえると本気で思ってる節があるな
Rubyの適用範囲がもっと広ければなあと考える事は 特に作者としては自然なことだと思うが
278 :
デフォルトの名無しさん :2010/12/22(水) 08:11:08
質問です Windowsで下記のプログラムを-Eを付けて実行するとEncoding::UndefinedConversionErrorが 発生します。どのように修正すべきか教えていただけませんか # coding: utf-8 require 'pstore' db = PStore.new("pstest") str = "あいうえお" db.transaction{ db[1] = str } db.transaction{ puts db[1] } C:\home\mechanize>ruby -v ruby 1.9.1p429 (2010-07-02 revision 28523) [i386-mswin32] C:\home\mechanize>ruby -Ecp932:utf-8 hoge.rb C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:499:in `write': "\xE3" from ASCII-8BIT to UTF-8 in conversion from ASCII-8BIT to Windows-31J (Encoding::UndefinedConversionError) from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:499:in `save_data_with_fast_strategy' from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:473:in `save_data' from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:335:in `block in transaction' from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:361:in `synchronize' from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/pstore.rb:321:in `transaction' from hoge.rb:5:in `<main>'
ああ、pstoreの中のFile.newが外部エンコーディングに引っ張られてるのか
…これどうしよう
>>277 たいしたことしてない
Net::HTTP.Proxy メソッドの定義見るとわかるが、ClassクラスのオブジェクトをClass.newで作って、
それにmodule_evalでクラスインスタンス変数の定義書いて、そのClassオブジェクトを返すようにしてる
klass = Class.new
klass.module_eval{
attr_reader :name
def initialize
@name='A'
end
}
p klass.new.name #=> 'A'
ぶっちゃけこんなマニュアルの中でこんな宣伝する必要なんてないと思うけどね
1.9時代においては削除されるべき無用で紛らわしい雑談だと思うよ、個人的には
280 :
デフォルトの名無しさん :2010/12/22(水) 09:11:16
pstoreするときだけ外部エンコーディングの影響をなくしたこれなら動く 当たり前だが # coding: utf-8 require 'pstore' db = PStore.new("pstest") str = "あいうえお" @evacuated_encoding_for_pstore = Encoding.default_external Encoding.default_external = Encoding::ASCII_8BIT db.transaction{ db[1] = str } db.transaction{ puts db[1] } Encoding.default_external = @evacuated_encoding_for_pstore puts してるのは UTF-8 エンコーディングの UTF-8 バイナリ列のままだから コマンドプロンプトでは化けるので注意
282 :
デフォルトの名無しさん :2010/12/22(水) 09:28:50
>>281 ありがとうございました。
リファレンスちゃんと理解できるよう出直します。
私のところでは、化けずに出力されてます。
どっちかというと、File にエンコーディングを指定できない(または固定しない) PStore 側がへなちょこなんだと思う ユーザー側にあんまり非はないし、この対処をマニュアルから読み取るのは不可能なんじゃないかな
>>275-276 言語のユーザーや仕事の開発者としては、Ruby向いてないところに差し迫ったら乗り換えて当然と思ってしまうけど
Matzは立場上(本気でそう思ってなくても)悔しがらないとあかんのでは?w
>>277 >メソッド中に動的にクラスを作成して、
>そのクラスを返すということが可能です。
>
>このメソッドの中にクラスって意味がわかりません。
メソッドの中でクラスを作成し、それを返す。ただそれだけ。
これはもとのマニュアルが悪いな。「動的に」なんて初心者にわかるはずがない。
直すなら
「メソッドの中でクラスを作成して返します」
「メソッドを実行するたびにクラスを作成して返すことができます」
とか。
>>284 それは単に表面的なスタイルの問題じゃないの?
インデント強制だからPython は嫌だとか言ってる人たちを思い出すな
どこをどう読めば
>>284 がスタイルの問題になるのかまったくわからない。
アンカーミスだよな?
288 :
286 :2010/12/22(水) 11:22:51
>>287 すまん。確かに275-276が違う所をさしてるように見えてしまった
最近Rubyはじめたんですが、クロージャのような無名の処理はみなさんどうやって文書化してます?
ソースがドキュメント
jrubyのnkfが壊滅的なのですがどうすればいいんでしょうか jrubyで文字コード変換するなということなんだろうか
292 :
デフォルトの名無しさん :2010/12/22(水) 16:21:18
>>291 もうJava標準APIを呼んでしまえ。
String#getBytesとかエンコード指定付きコンストラクタとか
Reader/Writerとか。
>>274 >matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
うそだぁ
ソースは?
>>291 そんなことはない
現在のJRubyの動作は基本的に完全だと外人さんも太鼓判を押している
128文字でお釣りが来る国の人の言うことはほんとに当てにならんからのう… まあNKF.guess組み込んで「エンコーディング対応しました」とか言う日本人もいるからどっちもどっちだが 案の定ISO-8859-xで盛大に誤爆して現在もコードまだ直ってない 君のことだよMechanize
>>294 nkfみたいな文脈で外人の太鼓判は信用できないwww
298 :
デフォルトの名無しさん :2010/12/23(木) 12:18:43
strip_tags は actionpack の SanitizeHelperモジュールで定義されている。 いろいろ依存しているライブラリがあるので、 require 'erb' require 'active_support/dependencies/autoload' require 'active_support/core_ext/class/attribute_accessors' require 'active_support/core_ext/string/encoding' require 'active_support/concern' # 面倒&初期化の重さを厭わないなら require 'active_support/all' require 'action_view/helpers/capture_helper' require 'action_view/helpers/sanitize_helper' 必要ならさらに include ActionView::Helpers::SanitizeHelper
299 :
デフォルトの名無しさん :2010/12/23(木) 12:36:44
必要ならつーかモジュールのインスタンスメソッドだからincludeせんと。
Rails3をインストールして、 適当にアプリ作る。 そこで rails console でrailsがバックにあるirbが使える
301 :
デフォルトの名無しさん :2010/12/23(木) 13:59:31
rails consoleでもObjectにActionView::Helpers::SanitizeHelperが includeされるわけじゃない(本来ビューレンダリング用のものだし)ので、 そこは必要。 ただし、helper というビューオブジェクトが存在するので、include しなくても helper.strip_tags('...') とは出来る。
そういうのを調べるのってリファレンスを見てるんですか? 日本語のまとまった情報とか無いですよね・・・
303 :
デフォルトの名無しさん :2010/12/23(木) 15:24:50
strip_tags については、リファレンスで SanitizeHelper のものだと 分かるので、あとはそれを使う環境を整えるために試行錯誤するだけ。
まあそのへんはRailsスレに行けばわか…わか…、 まあ、Railsも使っててRuby本体にも造詣のある人は少なくないだろうし わかるんじゃないかなあと思う RailsのことはRailsスレでやれバーカバーカというよりは、単に遭遇確率の問題
irbでrequire '"action_view"; include ActionView::Helpers::SanitizeHelperしただけだと 足りないメソッドあるし使えないから面倒くさい rails consoleのhelperから使った方がいいな 前はrails consoleから簡単に使えないメソッドもあったし(確かcontrolに依存していたり、内部で擬似的にリクエスト発生が必要だったり?) そういうのは徐々に改善されていっているようだけど
Rubyのソースファイルと実行結果が一緒に表示できるxmpfilterが便利 インストール。 $ gem install rcodetools
言えない、手書きでやってたなんて絶対に言えない
日頃Windows版でのテキストファイルの読み込みの遅さに辟易していましたが ふとバイナリモードにしてみたところ、これまで30秒程かかっていた読み込みが 1秒足らずで終わりました。後から強制エンコーディングするにもおつりが出る速さです。 なぜこんなにテキストモードのI/Oは遅いのでしょうか?
実装者に文句言ってけれ 知らないよ
> なぜこんなにテキストモードのI/Oは遅いのでしょうか? そりゃ1バイトずつ内容チェックしていって CR LF の並びがあれば "\n" に変換するという「無駄」な処理があるからに決まってるじゃん 変換がないだけならただ読んで終了だもの
データを読んだからにはそれに対するメインの処理を施すわけだが、 テキストモードで「改行コードを置換する」だけの処理がメインの処理よりも時間がかかるなんてことがあるのだろうか!
判断の処理とかさせるからだろ、 フールセーフ(アフォでも安全)というか、 自動判別させる処理とか裏で動いているから、
下のようにスクリプトファイルにテキスト名を指定せずにコンソールで指定するにはどうしたらいいのでしょうか? File.open("sentence.txt").each{|line| ...
コンソールからファイル名を読み込んで変数に代入しておき openにその変数を指定するとかではなく?
そういう一手間がいるんですね。 C:\>xxx.rb xxx.txt > xxx1.txt みたいなわけにはいかないのでしょうか?他の言語かじったときのイメージでこんな かんじでいけなるのかと勝手に思ってたのですが。 ぐぐってもでてこないのだから、ダメなんでしょうね。
テキストモードだとファイルの読み込み30秒、メインの処理1秒でした。 ちなみにCSVファイルの加工です。
そもそもコンソールってなんじゃらほ スクリプト起動時の引数に指定してそれを利用するパターン(推奨) inputed = ARGV[0] file = open(inputed, 'rb'){|f| f.readlines} puts "#{inputed} has #{file.size} lines" 実行: $ ruby hoge.rb sentence1.txt $ ruby hoge.rb sentence2.txt スクリプトを起動して対話的に指定するパターン(一見凄いが後々意外とめんどい) puts 'ENTER FILEPATH: ' inputed = $stdin.gets.chomp file = open(inputed){|f| f.readlines} puts "#{inputed} has #{file.size} lines" 実行: $ ruby hoge.rb ENTER FILEPATH: ← ここでキーボードからファイルパス入力してenter ちなみにこの file.size は実際の行数を必ずしも反映してない あと、ユーザーの入力が信用できない場合openにそのまま渡してはいけない
>>316 それは出力だろ
出力ファイルの名前のことなのか
君のレスは情報の多くが欠落している
欠落した情報でググっても何も出てくるはずもない
>>314 普通に書けば、
while line = gets
puts(line)
end
組み込み変数で明示的に書けば、
while line = $stdin.gets
$stdout.puts(line)
end
ドヤ顔したければ、
while gets; puts $_; end
>>318 初心者スレに初心者がレスすると不幸を生むから見てるだけのほうがいい。
>>316 Rubyの標準入力はIOオブジェクトとしてグローバル変数$stdinからアクセス可能
Rubyの標準出力はIOオブジェクトとしてグローバル変数$stdoutからアクセス可能
puts や print のデフォルト出力先は $stdout
スクリプト起動時の引数はARGV
「起動時引数をファイルとみなして開いたIOオブジェクトとみなすが、空の場合は標準入力に切り替える」のはARGF
…ていうか、標準入力や標準出力、起動時の引数を知ってればこれにたどり着くだろうから、
もしかして「コンソール」という言葉を知ってて呼び名を知らないんか
関係ないけど、最近の若いもんにちょっとテキスト処理のプログラム課題を与えたら、 とりあえずopenで開く人が多くて、なんだかなぁって感じがする。 普通は標準入出力使ってフィルタを作るだろ…言わなくてもそうなるだろ…? どうしてopenつかうんだよもぉぉぉぉぉ!
>>314 の回答は
>>318 だと思う
open して read する
対象のファイルの名前
を"コンソール"から指定したいのだろ
あとストリームを一気に読み込もうとする人! なんなんだよ!1行ずつ読み込んで1行ずつ処理しろよぉ! そうしたほうが省メモリだろぅ! 「でもメモリいっぱいあるし」 まぁそうだけどさぁ…><; メリークリスマス!
お前の言ってるコンソールは、もしかしてコマンドライン?
>>324 File.open("sentence.txt").each{|line|
# ここで読み込んだ内容を別途ファイルに保存したいが、
# 書き方がわからないので空欄にして質問しました
}
という質問の可能性を排除するような視野の狭い人は初心者スレで回答すべきではない
そもそも読み込み対象のファイル名は既に記載されてるではないか
なんでそれをユーザー入力させると誤読するのかマジ理解不能
なんだ冬休みか...
>スクリプトファイルにテキスト名を指定せずにコンソールで指定
>>327 いくつもの可能性があるからいちいち聞きなおさにゃならん
記載されてるファイル名をベタ書きしたくないと普通は解釈する
はいはいはい、引数に何か指定させようとする馬鹿は全員帰ってね それは元質問の「スクリプトファイルにテキスト名を指定」で既に行われてるから 引数によるファイル名の指定をやりたくないという質問なのこれは
>>331 テキスト名をコンソールで指定したい、だからファイル名を対話的に入力したいんだろ要は
>>318 の後半でいいじゃん
でも
>>316 みたいにやりたいのなら引数で渡したいってことじゃないのか
コンソールって言ったら普通は端末(エミュレータ)だろ 引数から入力したいならそういう風に言うはずだから、端末から入力する方法を答えればいい とりあえずは gets でいいんじゃね
とりあえず
ruby hoge.rb in.txt > out.txt
を
「ruby を hoge.rb と in.txt を引数にして起動し、標準入力のリダイレクトで out.txt に書き出す」
と読めてるかどうかでかなり説明レベルが違うような…
これなら「起動時の引数をrubyから取得する方法」と「標準出力
って、標準出力にはそれこそ普通に出力されててそれ以降はRubyの仕事じゃないじゃないですかやだー!
…引数を複数取ってrubyで利用する方法がわかればいいような気がする
ruby hoge.rb in.txt out.txt
と書いて in.txt を読み込んで out.txt に書き出す、ができれば満足されそうな
つまりはシェルのリダイレクトやらパイプやらを使用したくないんじゃないかと
>>316 を読む限り、コンソールという概念を勘違いしてるという読みは正しいと思う
ruby -n が欲しいんじゃないかなー
>>316 の「ほかの言語」はawkとかだと推測
てことで 「○○を××して△△するプログラムを書こうとしてここまでできたのですが、 ●●の部分を◇◇にする方法がわかりませんてめえら勝手に盛り上がってないでとっとと教えろカスが」 とか言ってくれると僥倖 たぶんこのへんのたいていのパターンはRubyで書けるし別に喧嘩してるわけでもないのでさくっと情報くれ
美女を籠絡して満喫するプログラムを書こうとしてここまでできたのですが、 一物の部分をギンギンにする方法がわかりませんてめえら勝手に盛り上がってないでとっとと教えろカスが
>>313 × フールセーフ(約2,580件)
○ フールプルーフ(耐馬鹿性, fool proof, 約5,120,000件)
○ フェイルセーフ(間違っても安心, fail safe, 約1,590,000件)
>>313 自身が馬鹿だということでフールセルフという言葉を授けよう
>>325 前の行に戻りたいときはどうするの?例えば、GenBankの出力で
LOCUS AB248268 638 bp DNA linear PLN 21-AUG-2007
DEFINITION Asarum heterotropoides var. heterotropoides gene for ITS1, 5.8S
rRNA, ITS2, partial and complete sequence, specimen_voucher: H.
Yamaji 6170 (TUS).
ACCESSION AB248268
//
...
となってるときに
{'LOCUS' => 'AB248268', 'DEFINITION' => 'Asarum heterotropoides var. heterotropoides gene for ITS1, 5.8S
rRNA, ITS2, partial and complete sequence, specimen_voucher: H. Yamaji 6170 (TUS).', 'ACCESSION' => ...}
という感じのHashをつくりたいときに、1行ずつの処理でうまくやれるアルゴリズムはあるのでしょうか?
DEFINITIONが終わったときにどうしてもACCESSIONの行を再読み込みするようなアルゴリズムになっちゃうんです。
ちなみに、DEFINITIONのあとに ACCESSIONがくることは保証されていません。別のフィールド(大文字のみ)か、
レコード区切り(//)が期待されます。
>>342 入力元となるデータが限定されており、そのサイズが十分に予想できてかつメモリに乗せてもかまわないのなら全て読み込んで処理すればいい。
流れてくるデータが1行単位じゃないのなら、1行単位で実処理するのは単にアホだろ データ区切りまでバッファしてから処理すればいい
いやー、すんません。大混乱を招いたようで。
>>335 さんのが最も聞きたいことに近いように思います。コンソールというのも、
勘違いというか、読んだHPでそういう使い方をしていたようにおもったもので。
コマンドラインというのが正確なのでしょうか。
>>335 さんのを利用させてもらいますと、
ruby hoge.rb in.txt out.txt
このin.txtという指定をコマンドラインでしたいのですが、その際のhoge.rbには
どう記述すればいいのでしょうか?今、下のような感じになってるわけですが、
"sentence.txt"という指定をファイルからはずして、コマンドラインから
好きなファイルを指定して実行したいのです。File.open()の()の中は
どうすればいいんでしょうか?それとも上の方で指摘されているような
記述じゃないと無理なのでしょうか?
File.open("sentence.txt").each{|line|
ary = []
line.chomp.split(/\s*\/\s*/).each{|item|
ary.push(item) }
略
とにかく hoge.rbに p ARGV と書いて ruby hoge.rb in.txt out.txt と実行してみろ。 そしたら後は ARGV でググレ。
347 :
345 :2010/12/25(土) 23:19:31
サンクスです。^O^ コマンドラインに引数ですか。コンソールとかコマンドプロンプトとかファイルとかで 延々とググッてました。
348 :
342 :2010/12/26(日) 09:03:38
>>343 ,344
ありがとうございます。元のデータはせいぜい数MBなので、全部読んでもいいと思いますが、
区切りまでバッファするというのは考えてなかったので、それでやってみます。
そろそろゴルファーとワンライナー信者による ruby -p -e を使ったテクニカルなフィルタがご覧になれます
-n, -p, -a はやらず嫌いはもったいない 来年の漏れの目標はなぜか sed, awk の習得です
351 :
デフォルトの名無しさん :2010/12/27(月) 08:25:06
sed awk して船山に上る
yield でイテレータを独自に定義 - Ruby入門勉強ルーム
http://www.mapee.jp/ruby/yield.html class Array
def each_twice
i = 0 # => 0
while i < self.length
x = self[i] * 2 # => 0, 8, 10, 14, 18, 64
yield x # => nil, nil, nil, nil, nil, nil
i += 1 # => 1, 2, 3, 4, 5, 6
end
end
end
d_ary = [0, 4, 5, 7, 9, 32] # => [0, 4, 5, 7, 9, 32]
d_ary.each_twice do |x|
puts x # => nil, nil, nil, nil, nil, nil
end
いやーrubyすごいね、arryって基本的な上位のクラスだと思うのだけれども。
何か特殊な指定もしなくても
class Array
だけで関数追加できちゃうんだね。
オープンクラスってRubyで初めて知ったんだけど、他にメジャーな言語で採用してるのってある?JSとかそうだったかな なんつーか素人から見ると、大事なところをこわしそうで怖いよねw
JSはプロトタイプ自由にいじれるんだっけ
そもそもJSの場合、真の意味でのクラスは存在しないからなぁ
真の意味でのクラスってなんだよw
分からないんならググれよ
いくらグーグルでもお前の妄想なんてヒットしないのだがw
全板強制IDでいいと思うわ 自演ばっかりうっとおしい
361 :
デフォルトの名無しさん :2010/12/27(月) 15:18:32
someday = Date::parse 2010.8.29 someday.upto(Date::today) do |val| p val end だと, Sun, 29 Aug 2010 Mon, 30 Aug 2010 ... Sun, 26 Dec 2010 Mon, 27 Dec 2010 のように,1日づつ出力されるのですが, Sun, 29 Aug 2010 Wed, 29 Sep 2010 Fri, 29 Oct 2010 Mon, 29 Nov 2010 のように月ごとの応答日を列挙するようなupto的メソッドってありますか? whileとかifとか条件文を使わずには無理でしょうか?
$ irb > require 'activesupport' => true > time = Time.mktime 2010, 8, 29 => 2010-08-29 00:00:00 +0900 > time = time.months_since 1 => 2010-09-29 00:00:00 +0900 > time = time.months_since 1 => 2010-10-29 00:00:00 +0900 > time = time.months_since 1 => 2010-11-29 00:00:00 +0900 > time = time.months_since 1 => 2010-12-29 00:00:00 +0900 これではどう?
363 :
デフォルトの名無しさん :2010/12/27(月) 15:36:49
(Date.today.month - someday.month).times.map {|i| someday >> i } とか。
364 :
361 :2010/12/27(月) 16:50:29
>> 362, 363
ありがとうございました。
>>363 では若干問題が...
somedayが2010.8.25の場合は,本日を基準にすると,12.25が既に到来しているので,
5こ列挙されて最後が2010.12.25になってほしいのです。
逆に
>>362 だと2010.12.29はまだ到来していないので,列挙してほしくない。
いずれにしても,示唆に富んだアドバイスをありがとうございました。
(条件文無しでは無理そうですね。)
メインの処理内に直接条件文を記述したくないということなら そのようなイテレータを定義するのもありかもよ 条件文はイテレータ定義内に書いておき メインの処理ではイテレータを使うとか
366 :
デフォルトの名無しさん :2010/12/27(月) 18:34:10
条件を書いていいなら # 1.9 someday.upto(Date.today).select {|d| d.day == someday.day } # 1.9 or 1.8 (someday..Date.today).select {|d| d.day == someday.day } あたりでOKなんだろうけど。
activesupportってなんでアンダースコア入ってないの?他は入ってるよね
require 'active_support' でも動作するんだから文句言うな 途中でgem名を変更されるよりはマシだ ActiveSupportは物凄く古いgemライブラリで、 これができた頃はまだgemライブラリの命名規則(規則というか、傾向)すらなかったのだ ActiveSupport式の命名法(AaaBbbCcc→aaabbbccc)は aaa_bbb_ccc 式の淘汰圧に負けたのよ
しまった、Date.today.mjdがゾロ目になる日に書き込もうと思っていたのに忘れてた。
module M def mes puts "mes!" end end と、自作ではなく既存のライブラリで定義されてるmesメソッドを includeやextendで「オブジェクトを汚染する」ことなく一発で利用することはできますか? M.mes みたいに使えるといいんですけど 事前に module M; module_function :mes; end するというのは今回不可です
Object.new.tap{|o| o.extend M}.mes Ruby1.8.6とかでどうすればいいのかは知らんw
mkmfを用いたextconf.rbってautoconfみたいな物っていう認識でOKですか? extconf.rbのオプションに--prefixを取らせたいのですが、どうやったら出来るでしょうか?
汚染することなくつかいたいなら、 デザインパターンのどれかをつかう。
デザインパターン関係ないだろ モジュールに定義されたメソッドを呼べないのはRubyの制限だ
え?
え?
377 :
デフォルトの名無しさん :2010/12/29(水) 08:39:45
>>372 現在インストールされているRubyの環境を使う、
拡張ライブラリ生成用autoconfという感じではないだろうか。
インストールされているRubyとは異なる場所に拡張ライブラリ
を入れたいということ?
>>370 では事前が駄目なら事後で
module M
def mes
puts "mes!"
end
end
module M; module_function :mes; end
M.mes
もしくは、
module N; extend M; module_function :mes; end
N.mes
> includeやextendで「オブジェクトを汚染する」ことなく一発で
この「事前」は mes メソッドの利用前にモジュール定義を再オープンしたりするのが不可ということだろ
なかなか辛い制限だが、ありえないことでもない
一応
>>371 みたいなミニなオブジェクト作らざるを得ないというのが回答になるのかね
o = Object.new; o.extend(M); o.mes
汎用にはこうか
mes は __send__ とかでは呼べないんだな
381 :
デフォルトの名無しさん :2010/12/29(水) 18:38:14
a = {aa => 12, ac => 10, ab => 15} b = {bc => 15, bt => 20, bh => 1} c = {cc => 13, cm => 304, ca12} d = [a, b, c] こういう風に配列に入ってるハッシュの中身をソートしながらaから順番に出力したいのですが、どうしたらいいでしょうか? 解答お願いします。
中身を?ハッシュを?値を? というか例が無茶苦茶すぎ
383 :
デフォルトの名無しさん :2010/12/29(水) 18:55:40
キーの重複を考慮しないとして、 d.inject(&:merge).sort 出力は好きなように。
すみません ハッシュのvalueをソートして、keyとvalueを出力したいです
385 :
デフォルトの名無しさん :2010/12/29(水) 18:57:30
確かにキーがローカル変数に見えたり=>がないところがあったり ソート基準が不明なのはよろしくないな。
386 :
デフォルトの名無しさん :2010/12/29(水) 18:58:57
ちっvalueかよ。じゃあ sort_by(&:last) 昇順降順のどっちかわからんが必要ならreverseせい。
387 :
デフォルトの名無しさん :2010/12/29(水) 19:12:05
&:mergeって何?
わかりにくく書くための魔法 ゴルファー御用達 他人に見せる説明や公開するコードでこれを使う人間は周りから避けやすくなるので便利
irb> h1 = {'aa' => 12, 'ac' => 10, 'ab' => 15} irb > h1.sort_by{|pair| pair.last} [["ac", 10], ["aa", 12], ["ab", 15]] irb > h1.sort_by{|pair| pair.last}.each{|k,v| puts "#{k} => #{v}"} ac => 10 aa => 12 ab => 15 irb>
うまく行けました ありがとうございます
>>388 ググってもHash#mergeしか見つからなかったorz
>>391 つ Symbol#to_proc
知らないとググりにくいよねこれ。
>>387 イディオム化して覚えているせいで、
>>383 にいたる経緯パッと説明できないんだが誰か頼む
こういうようなことを初心者向けに
Enumerable#inject の詳細と結合法則 - 今日調べたことまとめ
http://d.hatena.ne.jp/tks_period/20081207/p1 ruby-1.8.7-p302 > d.inject{|result, item| result.merge(item)}
↓
ruby-1.8.7-p302 > d.inject{|result, item| result.send(:merge, item)}
↓
(特にこの間)
↓
ruby-1.8.7-p302 > d.inject(&:merge.to_proc)
↓
ruby-1.8.7-p302 > d.inject(&:merge)
>>392 あーそうかブロックか。
助かりました。
>>395 そのページ自体はいいんだが、
> そうか暗黙の型変換だよ
> &を前置したからRubyは
> それが手続きオブジェクトであると期待したんだ
> でもその期待に反して&を伴っていたのはシンボルだったので
> そのオブジェクトに手続きオブジェクトへの変換を要求
> つまりto_procメソッドを自動で送信したんだ
ここが
>>393 の
> (特にこの間)
にあたるのだろうが説明出来ていない気がするw
def to_proc Proc.new { |obj, *args| obj.send(self, *args) } end
1.8だとブロック引数のスコープ汚染があるから便利なんだけど 1.9で直ったから別にいらないな>to_proc
yieldってブロックを渡したとき、 引数のように受け取った受け取り側のメソッドが その受け取ったメソッド自身で、受け取ったブロックを実行する命令のことか。
まあ、そんなとこ
るりまだった るびまんのリファンレンスってなんだw
yieldとcallbackの違いについて教えて下しゃれ
CUIのアプリを作ってるんですが、 WindowsとLinuxってデフォルトの文字コードが違いますよね…? そいで、ソースコードはUTF-8で書いて、OSを調べてkconvで適切な文字コードに変換して出力しないといけないんですけど、 putsのたびに文字コードを変換するの面倒ですよね? そいで、String#to_sをオーバーライドして文字コード変換するようにしたらいっかなー?なんて思ったんですけど、 なんかほかにいいやり方ありますか?
putsをオーバーライドすればいいじゃん
ruby1.9だと自動変換してくれるよ>コンソール
408 :
デフォルトの名無しさん :2010/12/31(金) 00:01:54
クラス変数とクラスインスタンス変数の使い分けが分かりません。。 継承させたい場合はクラス変数、 継承させたくない場合はクラスインスタンス変数 程度の認識で良いのかな? あとはクラス変数はトップレベルのスコープから影響受けるとか。 他には何か違いがあるのでしょうか?
>>409 誰かが自分のタイ焼きのアンコを食べたら、なぜかおまいのタイ焼きのアンコもなくなってもいいならクラス変数を使えばいい。
411 :
409 :2010/12/31(金) 03:20:02
>>410 他の言語(Javaとか)ではそれが通常の動作だと思います。
クラスインスタンス変数の場合、
同じクラスの異なるオブジェクトで共有することすら出来ないので
使い道があるのかさえ分かりません。
Javaでいうクラス変数の役割を期待する場合は、クセがあってもクラス変数を使わざるを得ないと思うのです。
私の頭が固いだけなのでしょうか。
( ゚д゚)
413 :
409 :2010/12/31(金) 03:43:28
すいません、かなり誤解されるような言い方でした。 >同じクラスの異なるオブジェクトで共有することすら出来ないので これは、インスタンスメソッドの中からクラスメソッドを呼べば、一応共有出来ますね。 class A @a = 1 def self.read @a end def read self.class.read end end a = new.A a.read でもこんなのは美しくないと思います。 class B @@b def read @@b end end b = B.new b.read やはりこちらが自然だと思います。
@@って使ったこと無いけどいつ使うと美味しいの?
>>413 悪いけど、何を言いたいのかよく分かりません。
Javaが得意だというなら、やりたい事をJavaのコードで書いてみて。
彼にとってクラスとは「名前空間をきれいに整理する存在」程度のものなのだと思う 実は昔のBasicとかCOBOLあたりの経験があるんじゃないだろうか Javaというキーワードが出てはいるが、 オブジェクト指向という言葉からはかなり遠いコードを書いているように思う
> クラスとは「名前空間をきれいに整理する存在」程度のもの 実際そうじゃん^^
>>413 まず「1つのクラスからはいくつもオブジェクトを生成できる」ということは解る?
組み込みのクラスで言えば、数値クラスとか文字列クラスとか、作れるオブジェクトが1つじゃ絶対困るよね。
そして、1つのクラス(仮にMyClassとしよう)から生成したオブジェクトがa,b,cと3つあるとする。
その際、a,b,cの間で異なる値を持つのがインスタンス変数。
逆に、クラス自体に値を持たせたい、同じクラスから生成したオブジェクト同士で共有させたい
という時に使うのがクラス変数。
たぶんこの使い分け自体はJavaでも同じだと思うから
使い慣れてるJavaで、もう一度OOPを勉強し直すと良いよ。
JavaのOOは異端
> 実際そうじゃん^^ 馬鹿確定
クラスインスタンス変数とクラス変数の違いを聞いているのになぜ インスタンス変数とクラス変数の違いを答えるのか
クラスインスタンス変数がインスタンス変数と何の違いも無く、ただのインスタンス変数であることを理解してない奴が多そうだ。
>>413 の言うことは結構最もなことで、他言語の実装を理解してる人が初めて見れば相当キモイ。
変数宣言の要らない(できない)Rubyではクラス変数を実装するのが難しいからクラスインスタンス変数で誤魔化すしかない。
クラスも所詮ただのオブジェクトなので、クラスインスタンス変数を持った所で他のオブジェクトに影響を与えることは無い。
同じクラスオブジェクトに対するアクセサを各インスタンスが持っているだけ。
なので
>>413 に対する回答としては、
クラスインスタンス変数は確かに誤魔化しの機能だが、Rubyではそれしか方法が無いので仕方ない。
クラスインスタンス変数の存在意義が分からないという
>>409 は
以下の実行結果に問題を感じないのか?
class Animal
attr_accessor :species
@@count_of_species = 0
def self.count_of_species
@@count_of_species
end
def initialize(species)
@@count_of_species += 1
@species = species
end
end
class Dog < Animal
end
class Cat < Animal
end
dog = Dog.new('shibainu')
cat = Cat.new('mikeneko')
puts Animal.count_of_species
puts Dog.count_of_species
puts Cat.count_of_species
428 :
デフォルトの名無しさん :2010/12/31(金) 18:56:21
>>428 検討中なんじゃなくて?おれの環境は1.9.2p0だよ
>>407 それは助かるわ。1.9に移行する利用がまたひとつ増えた
コマンドプロンプトで 1.9.2-p0 mingw32
irb -U起動後、日本語含むファイル名があるディレクトリで
puts Dir["*"]で文字化けする
あれ?何が悪い?
LANGが悪いんじゃね
433 :
sage :2011/01/01(土) 03:46:43
>>407 だめだった・・・
# -*- encoding: utf-8 -*-
puts "尾骶骨"
ruby 1.9.2p136 (2010-12-25) [i386-mingw32]
win32_utf-8_failed.rb:2:in `write': U+9AB6 from UTF-8 to Windows-31J (Encoding::
UndefinedConversionError)
from win32_utf-8_failed.rb:2:in `puts'
from win32_utf-8_failed.rb:2:in `puts'
from win32_utf-8_failed.rb:2:in `<main>'
case when n < 0 when n < 10 when n < 50 when n < 100 else end というようなことをやりたいときにもっといい書き方がありそうな気がするんだけどまったくたどり着けない 誰か知らない?
435 :
デフォルトの名無しさん :2011/01/01(土) 22:08:59
1.9系では Proc#=== が call のaliasなので(1.8系でも自分でalias1行書けば可能) lesser_than = lambda {|a| lambda {|b| b < a } } { 'Taro' => 90, 'Jiro' => 50, 'Saburo' => 30 }.each do |name, score| rank = case score when lesser_than[40]; "D" when lesser_than[60]; "C" when lesser_than[80]; "B" else "A" end puts "%s:%d:%s" % [ name, score, rank ] end Taro:90:A Jiro:50:C Saburo:30:D なんていう方法があるけど…いいと言えるかどうかは迷うところ。
>>435 Procを使うのは思いつかなかった
caseに式がついてるほうが好みだからこれはありがたい
lesser・・
438 :
デフォルトの名無しさん :2011/01/02(日) 00:31:25
less than か。
(⌒)_(⌒) / , 、ヽ ({{ o⌒o}}) 彡<_●_>ミ / ヽ || || U U ノ| /ヽ| (_ノU U
新年早々わらかすな
サー・イレッサー!
>>431 irb は -U オプションで default_external まで UTF-8 になるせいかな。
-Ecp932:utf-8 とかならいけるかも。
MLって初心者でも参加して逐一見たほうがいいですか?
仕事でRubyを使ってる人(要はそれで飯を食ってる人)は読んどいた方が良いかなぁと思うけど、 趣味でRubyを使ってる人や、仕事で自分のツールとしてRubyを使っている人はログを検索するだけで十分だと思う。
東大生の俺はRubyのMLなんてレベル低すぎて読みたくない
じゃあ発信する側に回れば
クラスインスタンス変数って知らなかったのでググってみたのですが 1. インスタンスメソッド定義内に書かれた @foo はインスタンス変数 2. インスタンスメソッド定義外のクラス定義内に書かれた @foo はクラスインスタンス変数 3. クラス定義内に書かれた @@foo という表記は常にクラス変数 別の言い方をすると A. def f ... end 内では self はクラスKのインスタンス B. class K ... end 内では self はクラスK(ClassクラスのインスタンスK) C. def self.f ... end 内では self はクラスK(これはBに吸収すべきか) で常に @foo は self のインスタンス変数で @@foo は self のクラス変数 というかんじの理解でよいの? それから 1.9 からクラス変数は継承しないという仕様になったそうですが、そうなると クラスインスタンス変数しか存在しなくなった(従来のサブクラスに継承されるクラス変数 はサポートされない)、ということ?
>>411 >クラスインスタンス変数の場合、
>同じクラスの異なるオブジェクトで共有することすら出来ないので
>使い道があるのかさえ分かりません。
>
そうかなあ。
・子クラスでも共有したい場合はクラス変数を使う
・子クラスとは共有したくない場合はクラスインスタンス変数を使う
でいいじゃん。
class Model
def self.table_name; @table_name; end
end
class Person < Model
@table_name = 'people' # 親クラスのデータは 'people'
end
class Student < Person
@table_name = 'students' # 子クラスのデータは 'students'
end
p Student.table_name #=> "students"
もしクラスインスタンス変数ではなくクラス変数を使ったら、PersonとStudentが同じテーブル名になってしまう。
共有は悪、というのが俺のジャスティス。 クラス変数もクラスインスタンス変数も断じて使わん!
rubyのプログラム中に他の言語を動かすことって出来るの?
451 :
デフォルトの名無しさん :2011/01/03(月) 09:38:26
コードの一部を直接別文法で書きたいのか、 ライブラリを使えればいいのか、 外部プログラムとして実行できればいいのか。
class BBSReader attr_accessor :uses_proxy # (ry end BBSReader.new.tap{|bbs| bbs.uses_proxy = true; p bbs.uses_proxy } # boolな値の属性の名前を付けるときのruby風プラクティスを教えてください # こういうときはどう名前つけるものなのでしょうか # # bbs.uses_proxy = trueだと、(proxyを使うという意図の)bbs.use_proxyと混同しないのか?とか # # boolを返すときはbbs.uses_proxy?のだとわかりやすいですが、 # attr_accessor, mattr_accessorのようなものを使う場合そこまでやってくれとはいえ # uses_proxy?にaliasするのもなんだかな、と思っています
一行要約: Railsっぽいbool変数、属性の命名方法教えてください
ruby的には動詞変化はなし BBSReader.new.tap{|bbs| bbs.use_proxy = true; p bbs.use_proxy } rails的 BBSReader.new(:use_proxy => true).tap{|bbs| p bbs.use_proxy }
Rubyでboolったら「?」だろうがよ ># boolを返すときはbbs.uses_proxy?のだとわかりやすいですが、 ># attr_accessor, mattr_accessorのようなものを使う場合そこまでやってくれとはいえ ># uses_proxy?にaliasするのもなんだかな、と思っています def use_proxy? @use_proxy end でattrいらない。
俺の会社では 「クラス変数は使用禁止」 だぞ。 理由は簡単で、クラス変数を利用しなければ不可能であるような実装はあり得ないからだ。
あんまり了解性のある理由になってないな…w じゃぁクラスも使用禁止だぞ。理由は簡単で(ry
じゃあRuby使用禁止な。理由(ry
Rubyのクラス変数は継承したクラスでもスコープが共有されるんで使いづらい
「クラス変数を利用しなければ不可能であるような実装」は無いだろうけど「クラス変数を利用しなければ余計な手間がかかる実装」はあるんだけどなぁ… 各所に余計な手間をばら撒いてまでクラス変数を禁止するメリットはないよね
>>459 初心者だから言ってみるんだけどさ、
スコープ共有としても、
触らなければ関係ないんじゃ?
継承して使わせるようなクラスの場合、クラス変数は使わないほうが無難な気がしますわ。
クラス変数の理想としては、 継承はされるがスコープは共有しない。 しかしRubyでは @継承してスコープまで共有する A継承すらしない のどちらかの方法でしか実装できない。 っていう認識で合ってるのかな? このジレンマの末、1.8では@を取り、1.9ではAを取る選択をしたということ? なぜか1.9でも継承されてるみたいだけど。
>>454 ありがとう
uses_proxyじゃなくてuse_proxyですか
Rails…w
>>455 setterというかattr_writerなしな前提でしょうか?
Rubyでboolだと
class BBSReader
def use_proxy=(value)
@use_proxy = value
end
def use_proxy?
@use_proxy
end
# (ry
end
とするのかなと思ってまして、attr_accessorなどを使って楽すると
class BBSReader
attr_accessor :use_proxy
alias :use_proxy? :use_proxy
# (ry
end
とするものかなと
>>452 でいいたくて
465 :
455 :2011/01/04(火) 00:34:03
>>464 ごめん。
実は俺自身も初心者に産毛が生えた程度だからあまり偉そうに言えなかったりする。
でもRubyらしくってことならやっぱりboolはクエスチョンマークの付いたメソッドで得るものだと思う。
んで、セッタのメソッドを作るんじゃなくて、
def use_proxy
@use_proxy = true
end
def unuse_proxy
@use_proxy = false
end
みたいにする。
変数とメソッドの名前を今までの話を引き継いだものにしたから、このままじゃちょっと違和感あるけど。
attr_は極力使わないほうがいいはず。
どうでもいいかもしれないけど、proxy_used?のほうが好きかな
468 :
デフォルトの名無しさん :2011/01/04(火) 12:45:44
>>467 sprintf.c のrdocコメントに記載がある。
>>468 すばやいレスありがとう!
確かにありますね。
これで、心置きなく使えます。
attr_* は初心者的実効性に疑問符がついてると思う 何が悲しくて内部変数名と同名のメソッドを定義強制されなければならんのかと小一時間 確かにラクなのだが、他人様の前に出すようなクラスなのなら 使用する前にちょっと考えてみたほうがいいかも
話が逆だろ? インスタンス変数と、読み書き以外何もしないセッタ・ゲッタを、ひととおり定義したい、 という時に、DRY的な理由から使うのがattr_*だと思う。初心者だろうが熟練者だろうが。 他人様の前に出すようなクラスなら、より抽象的にわかりやすくなるのだから、 積極的に使うべき。
attr_*を使わずどうするのか書いてないから何とも言えないな
>>470 は具体的にどうすればいいと思ってるんだよ
>>471 本当にattr_を使わなければならないのかどうか考えろってことだろ
DRYもいいがカプセル化も重要
>>472 俺470じゃないけど
>>465 みたいなのじゃないかな?
少なくともインスタンス変数を外から直接操作できるなんて可能な限り避けるべき
悲しいならattr_*を使わなければいいだけの話だろ 自分で勝手に宣言しておいて「強制」とか訳わからん
attr_*を使うべきじゃないってのは >インスタンス変数と、読み書き以外何もしないセッタ・ゲッタを、ひととおり定義したい、 というのがそもそもよくないと言っているのか
attr_がセッタ・ゲッタという認識なら改めたほうがいいと思う。 じゃあなんなん?と問われると今はちょっとそんな元気は無いので元気なかたに譲る。
「名前重要」とかいう割に、 インスタンス変数とメソッド名に共通の名前などという都合のよい果実を求めさせるスタンスがよくない …ような気はする attr_ で定義されたメソッドは、なんというか 中の人の都合の内部構造に思いッきり引っ張られてて、一般ユーザー視点ではわかりにくいことがなくもない proxy_addr= で @proxy_addr を設定するのではなく set_proxy(addr, host=nil) で @proxy_addr と @proxy_host を設定するほうがフレンドリーじゃね、みたいな感じ
最近はセッターなんて定義せずにHashでパラメータ与えるほうが多い気がする。
45 名前:デフォルトの名無しさん投稿日:2009/12/07(月) 11:16:10
>>44 そういう考え方もある
内部変数名と同じ名前のpublicなメソッドを外部提供する理由は本来無い
ユーザーに提供されるべきは、もっと一段上の名称&機能なメソッドであるべき
attr_writer :username, :password
ではなく
def user_info(h={})
@username, @password = h[:username], h[:password]
end
とかのほうがいいんじゃね、みたいな考え
オープンクラスだし堅いこと言うなJava使えJavaって感じではあるが
こういう感じのことかな?
>>474 attr_* が無為にガンガン使われまくってる現状を憂いてるのかもしれん
「インスタンス変数の操作はattr_系を使うほうがよい」みたいな思い込みみたいな
rdocがattr_を特別扱いしないだけで状況はかなり変わると思うんだがな
proxy_addr と proxy_host ってひょっとして被ってね addr_port とかじゃねこれうんすまん
>>477 ミスった
>>479 あーそんなん
インスタンス変数名とメソッド名称をがっちり結び付けてるのが、なんかヤ
それが当たり前のように初心者に浸透してる感じなのが、更にイヤ
そういう attr_ で提供された微妙な名称のメソッドを使わざるを得ないときとか、もにょんする
アクセサメソッドってものがそもそも泥臭いというか def flag @flag end def flag=(val) @flag = val end じゃなくて def use @flag = true end def release @flag =false end def used? @flag end にしようよっていうような。
たとえば、 class Point attr_accessor :x, :y end こういう場合に使うものだと思うけど。
>>479 目から鱗だな。確かに複数のsetterが関数で存在する必然性はない気がする。
これは面白い。
なんか大昔のめんどくさいOOP議論を思い出すな
487 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/04(火) 22:15:36
6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww 6、Rubyコミュニティの何人かはクソのような振る舞いをやめろwww
Rubyを使う以上は「Rubyらしく」と「オブジェクト指向らしく」はなるべく守るべきだと初心者なりに思う
489 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/04(火) 22:47:52
オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) なに?wブロガーとかがOOPとかについてわめいてるから?wオブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) オブジェクト指向つかわなくてもかけるじゃん(笑) なに?wブロガーとかがOOPとかについてわめいてるから?w
raiseして放置するとスタックトレースの表示がだらだら出るじゃないですか。 あれを begin raise rescue => e p e # ここで表示させるにはどうすればいいですか?e.backtraceは寂しすぎる。 end
callerかな
492 :
デフォルトの名無しさん :2011/01/05(水) 15:11:46
eclipseでpを日本語で使うとコンソールに文字コードで表示されちゃわない? putsなら問題ないんだけどな・・・
関数的メソッド p が利用する String#inspect は、本当はニホンゴ文字として表示したがっているのだ ユーザーの環境でニホンゴ文字が利用可能かの判断は、$KCODE の設定の有無を見てる $KCODE が "NONE" であるなら、文字列を \123 等のバイト列表示に変換して標準出力に流す てことで、適宜 $stderr.puts str.tosjis とかするか、$KCODE="s" した上で p str するかしれ 個人的には p でニホンゴ文字が表示されてしまうのは好きではない 設定の有無だけじゃなくて内容も見て自動で変換とかやって欲しくね、というのをやってるのが Ruby1.9.x
Rubyとかww Perl最強だぜ!
Perlだけしか使えないやつはばかやで PHPも使えるけどな
これはこれは やっぽさん恐れ入りますわー
498 :
まっつ :2011/01/06(木) 18:16:05
せやなー
Ruby 1.8.7 でメソッドの返りで return を使うと、 return を省略した場合に比べて遅いんだけど、そういうもんなのかな? 1.9 系ではほとんど変わらないみたいだけど。
フンガ?
>>499 1.8ではそういうもんです。
1.9では最適化されるのかも。
502 :
デフォルトの名無しさん :2011/01/06(木) 21:52:48
puts RubyVM::InstructionSequence.compile(<<SCRIPT).disassemble def sum(a, b) a + b end puts sum(1,2) SCRIPT returnあってもなくても同じ結果になるね。
503 :
デフォルトの名無しさん :2011/01/06(木) 23:59:24
初心者はまず最初に何を作ればいいの?
俺はテキストフィルタだったな Windowsのコマンドプロンプトは、標準だとテキスト処理のコマンド足りなさ過ぎだから 他の言語とかでコマンドプロンプト使う機会が多かった俺にはなかなか役に立った
今必要なものを作ればいい なければこれまでに必要になったものをもう一回Rubyで書いてみるとか
テキストフィルターの作り方 0. 準備 パスの通っている場所を確保する -S で起動できるかテスト または *.rb に関連付けて、スクリプトファイルだけで実行できるようにする。 1. 第一段階 # オプションの -p や -n は使わない。 ARGF.each{ |line| # ここに何か書く print line } 2. 第二段階 optparse または、getoptlong を使ってオプションを取り扱う 3. 第三段階 関数・メソッドを書いて、見通しを良くする
>>503 メソッドの説明とかある程度見聞きしてサンプル写経してなお、
特に作りたいものも作れそうなものも思いつかないなら、
とりあえず一旦Rubyを置いて街に出て別なことやれ
必要になったらたぶんまたRubyに帰ってくるからさ
プログラミングなんて無理してやるようなもんでもねえよ
おまえらホント暇そうだな
unable to convert U+201D from UTF-8 to US-ASCII for lib/rdoc/text.rb gem update したらエラーが出るよ〜
XP&IRBでs="【1】"って入れるとなんかおかしくなる。 cmdだと特に乱れたりしないんだけど。 なんか文字コードの設定とかいるんですか? >> s=" y1 z" => "【1\201z" >> puts s 【1】 => nil >> `ruby -v` => "ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]\n"
512 :
デフォルトの名無しさん :2011/01/09(日) 17:08:29
>>511 String#inspectのバグ。お使いのバージョンの直後のp250で修正されてる。
あと、バージョンを出すときは、RUBY_DESCRIPTIONという定数があるよ。
513 :
デフォルトの名無しさん :2011/01/09(日) 17:12:19
補足。 irbの出力は、最後に評価(実行)した式の値をinspectしたもの。 putsはinspectしないので化けない。
>=> "ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]\n" >お使いのバージョンの直後のp250で修正されてる。 よく見たら一年前のバイナリ… irb(main):008:0> RUBY_DESCRIPTION => "ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-mswin32]" に変えてみたところ症状は変わらず。 s="【1】" を左から順番に打つと問題なく入力でき s="【】" と打ってからカーソルを戻して1を入れると irb(main):006:0> s=" y 1z" => "【・z" irb(main):007:0> puts s 【・z のように崩れるみたいです。 窓の設定で関係ありそうなのはこれくらいですかね。 現在のコードページ 932(ANSI/OEM - 日本語 Shift-JIS) とりあえず余所で打ってコピペすれば先に進められそうなので解決?しました。 ありがとうございます。
515 :
デフォルトの名無しさん :2011/01/09(日) 17:50:42
部分的にでも表示されるってことは$KCODEは設定されてるのか。
rubyopt=-Ks 〜〜 と環境変数を設定してあるので >> $KCODE => "SJIS" になってます。
>>514 > 変えてみたところ症状は変わらず
いや変わっとるがな
String#inspect で最後の文字がバイト表現になるのはバグで、p330 で修正済み
irb において、バックスペースで Unicode の曖昧幅の記号文字を消すとその後のカーソル位置が不良になるのは
readline かターミナルエミュレータか何かが原因だろう
・ 純粋なコマンドプロンプト上の話ではない ・ マルチバイト非対応のreadline.dllをパスのどっかで読み込んでいる ・ 誰も試してなかったが、半月前に出た 1.8.7-p330 の mswin32 の Readline が実は変 どれかなんじゃないかな
案外3番目のような悪寒
RubyInstallerか何かに添付配布されているrbreadlineじゃないよな いやあれはそもそも不安定すぎて入力したらよく落ちるが
アップデートしようとしてp330のzipをダウンロードしたのですが、展開したら中身がやけにいっぱいあってびっくりしてます。 今はp302で、Ruby187フォルダの中には「bin」「doc」「lib」「share」フォルダとアンインストーラしか入っていません。 失敗が怖くてまだ何もしていない状態なんですが、これはp330の中身を丸ごとコピーするというのとは違いますよね? ここからどうすればいいんでしょうか?
ActiveScriptRubyの拡張子がmsiのやつでインストールすれば?
>>522 言われるまで全然気づきませんでした。
ありがとうございます。
524 :
デフォルトの名無しさん :2011/01/10(月) 08:06:27
ローマ字表記などに使われているマクロン付の文字を マクロンがつかないアルファベットに変換するにはどうすればよいですか table = {"\u014c" => "O", "\u014d" => "o"} #他のは省略 table.each{|key, value| res.gsub!(key, value)} puts res.encode("CP932", :undef => :replace, :replace => 'UGAAAAAAAAAAA') こんな風にやってますけど、いい方法を教えてください ruby 1.9.1p429 (2010-07-02 revision 28523) [i386-mswin32]
require 'rubygems' require 'addressable/idna' def unicode_canonical_decomposition(one_char) [Addressable::IDNA.__send__(:unicode_sort_canonical, Addressable::IDNA.__send__(:unicode_decompose, one_char.unpack('U*')) ).first].pack('U') end str = "?, ?, ?, ?, ?" puts str.split(//u).map{|s| unicode_canonical_decomposition(s)}.join #=> "a, e, i, o, u" UTF-8 の「1文字」だけを unicode_canonical_decomposition に渡す addressable gem をインストールしてない場合は gem install addressable いくつか問題がある いちばん大きいのは、Unicode 正規分解が可能なものはぜんぶ分解してしまうこと これを制御することはできない puts "ぱぴこ".split(//u).map{|s| unicode_canonical_decomposition(s)}.join #=> "はひこ" "?" みたいな2文字+ダイアクリティカルマークに分解されるものは unicode_sort_canonical の返り値からアルファベットだけ探すという処理を入れないと無理 str = "?" puts str.split(//u).map{|s| unicode_canonical_decomposition(s)}.join #=> "a" あと、うっかり Ruby1.8 でサンプル作ったので 1.9 に変換するのめんどい 自力で好みのテーブルを作って置換するのがいちばんだと思う
ああ、なんかもう当たり前のように化けてるな require 'rubygems' require 'addressable/idna' def unicode_canonical_decomposition(one_char) [Addressable::IDNA.__send__(:unicode_sort_canonical, Addressable::IDNA.__send__(:unicode_decompose, one_char.unpack('U*')) ).first].pack('U') end str = "ā, ē ī ō ū" puts str.split(//u).map{|s| unicode_canonical_decomposition(s)}.join #=> "a, e, i, o, u" str = "ぱぴこ" puts str.split(//u).map{|s| unicode_canonical_decomposition(s)}.join #=> "はひこ" str = "ǣ" puts str.split(//u).map{|s| unicode_canonical_decomposition(s)}.join #=> "a"
527 :
デフォルトの名無しさん :2011/01/10(月) 09:27:05
Unicode正規化の合成・分解はActiveSupport::Multibyteでも出来るかも。
528 :
デフォルトの名無しさん :2011/01/10(月) 09:46:55
>>525-527 addressableもActiveSupport::Mulibyteも使ったことないので
これを機に試してみます。ついでに逃げてきた文字コードの
勉強することにします。ありがとう
Rubyでは関数に引数を渡すと、参照渡しになるのでしょうか。 たとえば関数の引数に配列を渡し、関数内でその配列を操作すると、もとの配列が変更されてしまいます。 def f(arg) arg << "x" end arr = ["a", "b"] f(arr) p arr #=> ["a", "b", "x"] これがPHPなら、argを変更してもarrは変更されないのですが、Rubyは違うようです。 つまり、Rubyは参照渡しだということなんだと思いますが、あってますでしょうか。
>>528 require "rubygems"
require "babosa"
p " ".to_slug.approximate_ascii.to_s #=> "aeiou"
でよくね?
532 :
デフォルトの名無しさん :2011/01/10(月) 10:13:29
>>530 babosaってなんじゃらほい、と思ってググったが、URLのslugを作るライブラリか。
>>529 実のところ「参照渡し」ではない
参照渡しだとして理解すると本当は危険
というか参照渡しとはなんぞやという面倒な話に
「オブジェクトそのものを渡しているわけではありません」という慎重な表現が
>>529 Rubyに関数は(ry
irb(main):001:0> def f(arg)
irb(main):002:1> arg = [0, 1, 2, 3]
irb(main):003:1> end
=> nil
irb(main):004:0> ary = [4, 5, 6, 7]
=> [4, 5, 6, 7]
irb(main):005:0> f(ary)
=> [0, 1, 2, 3]
irb(main):006:0> ary
=> [4, 5, 6, 7]
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1534 >rubyには値渡ししかなく引き数として与えられた変
>数の値を変えても元の式の値は変わりません.ただし,オブジェク
>トの参照が渡るので値に対して破壊的な操作は可能です.
Rubyの変数は「ラベル」として考えるもので、メソッドの引数は「ラベルの値渡し」をしている。「オブジェクトの値渡し」ではなく。
とりあえずググればいろいろ出てくるよ。
いろいろ出てくるがかなりの確率で、内容がハズレだ
過去スレで書かれたもののほうが短さと適切さのバランスが取れてる気がする
そこら辺はJavaと全く同じだからJava経験者なら分かりやすいだろう
関係ないんだけど配列の値渡しってどんな実装?
PHPみたいに配列の中身がごそっとコピーされるようなものを期待しているとしたら、 自分でそのように書かない限り、Rubyにそのようなものはないぞ。
すごいよMarshalさん
そうそう、Marshal 経由でコピーがあったね。
NokogiriでHTMLをパースしたいのですが、 のようなエスケープ文字が勝手にアンエスケープされてしまい、困っています。 html = Nokogiri(<html><body>こんにちは テストです。</body></html>) text = html.search('body').first textの中身は以下のようになってしまいます。 <body>こんにちは テストです。</body> のようなエスケープ文字をそのまま保持させる方法はないでしょうか。
↑すいません、訳分からない文になってしまいました。 再投稿します。 NokogiriでHTMLをパースしたいのですが、 &nbsp;のようなエスケープ文字が勝手にアンエスケープされてしまい、困っています。 html = Nokogiri(<html><body>こんにちは&nbsp;テストです。</body></html>) text = html.search('body').first textの中身は以下のようになってしまいます。 <body>こんにちは テストです。</body> &nbsp;のようなエスケープ文字をそのまま保持させる方法はないでしょうか。
HTMLにエスケープ文字はない はともかく、実体参照の解決はlibxmlが制御できんとこで自動でやってるので制御できん ナマのHTMLを取得する手段はないと思ってくれていい
547 :
545 :2011/01/10(月) 21:24:23
>>546 おおおそうだったのか。。
よく分かりました。貴重な情報ありがとうございました。
そういうときはhpricot使ってる
URLコピペミスした。気にしないで。
オブジェクトの内容を参照するための情報を引数として渡しているのは間違いがない ただ、それは「参照渡し」とは違う
参照渡しはC言語にしか存在しないのでC言語以外でこの言葉を使用するのを禁止するって法律に書いとけ
>>553 C 言語には「存在しない」が。全部値渡しだぞ、あれ。渡してる値が整数だったりポインタだったりするだけだ。
C++ や Pascal には参照渡しがある。
というか参照渡しとはなんぞやという面倒な話に ある言語の概念を他の言語に無理矢理適用しようとするのやめようぜ
やっぱり紐だよ紐。 変数は荷札。引数は荷札と紐を渡す。
ユビキタスシステムが普及して万引きが減ると良いね
やたー 名前渡しできたよー def namae(arg) eval "#{arg} = 999" end $hensu = 1 namae :$hensu p $hensu #=> 999
Cのポインタ渡しは参照渡しだろうという説はある Cには参照渡しが「ないからこそ」、Cでのポインタ渡しは ポインタ以外を渡す行為と対称して参照渡しと呼ばれるのだな Cだけの世界では、>552的な意味で間違ってはいない まあ、汎用な計算機科学っぽい事象かと思ったら 特定の言語実装べったりのローカル概念でしたというのは 稀によくある
単に誤用してるだけだな。 たまに俺の用法で辞書書き換えろとか言い出す困ったちゃんもいるが。
> Cには参照渡しが「ないからこそ」、Cでのポインタ渡しは > ポインタ以外を渡す行為と対称して参照渡しと呼ばれるのだな 呼ぶな。 C++ には本物の参照渡しがあるし、早速混乱するぞ。
Cしかやらないのなら問題はないし、Cで終わる人も多かろう というか値渡しだって「値を渡してるから略して値渡しなんだよね」と認識してる人が大多数だろう 「ポインタという名前の参照用情報を渡してるから略して参照渡しと呼ぶね」と認識することを責めることはできん
C++もやる人と同じプロジェクトに放り込まれて混乱するわけですな。
めんどくせえ… ・ 不用意に略語にするな ・ あなたのプログラミング上の造語はほぼ確実にどっかの専門用語だ ・ 正しい語を使って話せ でいすか
お前ら一体何十回同じ話ししてんのかと 技術解説+理解を促進させるサンプルがあれば 不正確な比喩表現なんて必要ない
>>565 説明表現を考えているわけではない
「それは〜〜が〜〜で〜〜〜なわけだ」
「なるほど○○なんですね」 ← これ
「いや違う」
をなんとかしようなんとかできんなという話だ
>>566 いや違う〜は〜って意味だから覚えてね、でOKじゃん。
読むだけ時間の無駄。
基本、Cしか知らない人はRubyしか知らない人並みに害悪を撒き散らす 適当な壷の中にでも封印しておくのがよい
その話もう終わってるから
何らかのクラスやモジュールの定義をスクリプトとして視覚化というか文字列化というか、可能? ぶっちゃけツクールの組み込みクラスなんだけども、どう定義されてるか見てみたいんだ。
どのツクールだよ
XPのInputとかWindowとかが見たい できたらいいなとは思うんだけどやっぱり無理かな
> InputとかWindow rubyにそんな機能はないです
「ツクールの組み込みクラス」って書いてあるのにその突っ込みはないわー
>>574 詳しく知らんがRPGツクールだろ
>>574 ソースを見たいということならば、そのInputやWindowがネイティブコンパイルされた拡張ライブラリでないなら
中身を見られるかもね
でも確かファイルやライブラリは暗号化されていたはずだから、なんらかの方法で復号化のメソッドを探せばいんじゃないかな
ただ拡張ライブラリ内で復号化してそのまま読み込まれていたら面倒だな
>>577 今の自分にはハードルが高いということは分かった。ありがとう。
もう少し調べてみる。
>>578 open('./rpg.rb', 'w'){|f|
ObjectSpace.each_object(String){|x|
f.write x if x.include?('module RPG')
}
}
>>579 ありがとう。どこに置けばいい?
イベントコマンドでもスクリプトエディタの何もないところでも「module RPG」がずらっと出力されるだけだった。
ちなみにif以降を消して実行してみたらRPG::Mapとかは取り出せたけどInputやWindowは出なかった。
バイナリファイルを開いた時のようなごちゃごちゃした部分がかなりあったんだけど、つまり
>>577 の言った通りネイティブコンパイルされてて取り出せないということだろうか
>>579 'module RPG' みたいな文字列リテラルはブロックの外に出さないと
ブロック評価するたびに文字列オブジェクト生成されるから
「module RPG」が無駄にずらっと出力されてしまうと思われ。
以前このスレだか過去スレだかでWindowsでテキストファイル読み込む時は バイナリモードで読んでからforce_encodingすると速いと書いてあったんでやってみた。 爆速じゃねーか 内部で自動的にやってることをスクリプトに書き出しただけなのになんでこれほど違うんだろう?
Windowsのテキストモードでは \r\n \n \r のどれでも改行だと認識するためのUniversalNewline とか言う処理が入っていて遅いと聞いた ワンライナーや自作テキストフィルタで1.8だと 1秒未満のやつが 1.9だと2〜3秒かかって、イラッと来るときがある ブロックデバイスからのファイル読み込みに限って、高速なルーチンに切り替えるとかできないものだろうか
逆に言うとWindows以外やWindowsのバイナリモードだとその処理が入ってないって事か? Windows上で作成した\r\n改行のテキストファイルをLinux上で読むと結果が異なってくる?
日本語でおk
>>584 改行処理なんてやってるのはメジャーどころじゃWindowsぐらいじゃないかな
もしかしたらMacOSもやってたかも知れないが(今はUnix系なので多分やってない)
ShiftJIS + \r\nなら、Linux上でも最近のエディタなら流石に読めるよ
中途半端にEUC + \r\nとかやられたら流石に分からんかも知れんがw
いやエディタはどうでもよくて、RubyでShitJIS+\r\nのファイルを読んだときどうかという意味です。 もちろんエンコーディング指定は適切にしたとして、$がどこにマッチするかとか振舞いに違いがあるのかどうか
force_encoding は中身に手をつけないだろ。 爆速に決まってるじゃねーか。エンコーディングのラベルをはりかえる以外なにもしないんだから。
>>590 最近はソフトとか勝手に入れられなくてね
>>591 そういうからくりでしたか。納得です。
会社のPCで環境作れないなら そのくらい家でやればいいだろw
まったくです。
ubuntu10でRuby1.9.2をコンパイルしようとしています。 コンパイルする前にあらかじめインストールしておいたほうがいいライブラリはありますか。 現在のところ、libreadline-devをインストールしておいたほうがいいことは分かってます。 けどdebian系だと、インストールしておいたほうがいいライブラリがほかにもあった気がするので質問してみました。 知ってる人がいたら教えてください。
596 :
デフォルトの名無しさん :2011/01/15(土) 14:12:19
libssl-dev zlib1g-dev libncurses-dev libffi-dev libyaml-dev で足りると思う。 あと自分はいれていないが、必要であればTcl/Tk
ruby1.9-devの依存先をたどれば良いジャマイカ。
>>595 ↓実行すればバイナリ作るのに必要なもの全部入るよ
1.9.1だけどあんまり変わらなんじゃないかな
sudo apt-get build-dep ruby1.9.1-full
ライブラリじゃないけどruby1.8とbison(とtrunkならautoconf)はうっかり入れ忘れることがある ビルド失敗ですぐ気付くからいいけど
600 :
デフォルトの名無しさん :2011/01/15(土) 17:02:25
tarballからのビルドならrubyとbisonはいらないハズ。 リポジトリからだと必要だけど。
>>584-587 Windowsで改行処理してLinuxでしてないってこと?
今の時代むしろナンセンスに感じるんだけど
もうFTPで転送時に改行コードや文字コード置き換える時代じゃないし
それだとWindowsで読めていたテキストが、Linuxで改行増えているようなことになるのかな?
Windowsで編集して、Linuxで処理するようなこともよくやっていて気になった
旧Mac(\r) ユーザーのホームページで、変な改行になっているのは、かなり見たことある。 HTML のソースを良く見た頃の話だけど、Mac ユーザーの HTML は一部が壊れていた。 あと Mac は、ファイルの先頭にプロパティがあったじゃん。 あれも、変なデータをうpする原因になっていたんだろうなと思った。
\rを何だと思ってるんだ
MacBinaryは良いアイディアだと思うけどなぁ BOMいらなくなるじゃん?
自分のPCでソースを普通に見れないと「壊れている」ってか?
1.8系でUTF-8のファイルパスを使用する方法があったら教えてください openやFile.exist?の引数としてUFT-8のファイルパスを指定したいです というか、wxRubyがUFT-8前提なのでUTF-8が通らないと日本語パスが使えない・・・(´・ω・`)
>>606 wxRubyがどうのよりも1.8系はUTF-8を扱えてもmswin32やmingw32はUNICODEのファイルパスにそもそも対応していないのでは
Cygwinを使うのも手だけどwxRubyが問題か
後発のスクリプト言語のくせに C みてぇだな。
609 :
606 :2011/01/16(日) 23:06:45
>>607 レスありがとう
Cygwinはライセンス的に使えるライブラリが限られてしまうので避けたいです
1.9.2@mswin32でUFT-8のファイルパスが扱えることは確認しました
・・・が、今度は1.8.7で動いていたwxRuby関係のコードが動かない罠
こりゃ詰んだか・・・il||li ○| ̄|_
Class.superclass => Module Module.class => Class どういうことなの。。
>>610 それはどういうことが分からないんだ?
・回答A
ClassはModuleを継承している。
でもModuleもClassのインスタンスであり、すべての親であるObjectだってClassのインスタンス。
こういった基本的なクラスは相互に依存し合っていて、どこかが欠けると成立しない。
卵が先でも鶏が先でもない。両方あるからこそ成り立つ。
だからこそ、言語本体に組み込まれて存在している。
・回答B
後者の式は「Moduleクラス」や「Classクラス」のクラスを得る式。
クラスのクラスを得るのだから、当然返ってくるのはClassに決まっている。
Moduleクラスそのものを得たいなら
Module.class
なんて書くのは完全に蛇足で、単に
Module
と書く。
>>610 どういうことって言われても。。
>Class.superclass
>=> Module
Classの親クラスはModuleってだけのこと。
>Module.class
>=> Class
ModuleはClassクラスのインスタンスオブジェクトだってだけのこと。
ModuleもClassもStringもObjectも、Classクラスのインスタンスオブジェクト。
そんな偉っそうに書いてて恥かしくないの?
pgr
>>612 そんなのわかってんだろうけど、
つながりとして考えたとき驚いたってことだろ。
得意になって断片的な説明して笑えるw
一人で笑ってれば?
おれも笑った
>>610 がどういう挙動を想定してそれがどう違って驚いたのか具体的に書かないと、
結局断片的な説明しかできないじゃん。
それを得意になって笑えるとか、そんなん悪趣味な釣りとしか思えんよ。
いやー、笑った笑った
自分以外みんなわかってるなら、それは自分がおかしいのだ そう考えるようにした方がいい。まだ間に合う
わらうなら612じゃなくて
>>611 だろ。
>>611 >Moduleクラスそのものを得たいなら
>
>Module.class
>
>なんて書くのは完全に蛇足で、単に
>
>Module
>
>と書く。
Module.class で返されるのは Class であって Module ではない。
>>622 >>611 の指摘はそれほど外してない気がする。
>>610 は Ruby のクラス階層の is-a has-a の構造で混乱しているんじゃないかな。
そんなhas-aないだろう
>>623 >
>>610 は Ruby のクラス階層の is-a has-a の構造で混乱しているんじゃないかな。
混乱しているのはおまえのほう。has-a関係ない。
>>624 誰も気づいてないようだからつっこんでやるけど、だれがうまいこといえと
class は Object のメソッド superclass は Class のメソッド 並べると確かに変だな。
627 :
610 :2011/01/18(火) 02:56:26
中途半端なレスしてすいませんでした。
意図していたことは
>>611 さんの回答Aで言っていることそのままでした。
Class.superclass
=> Module
ClassはModuleの性質を受け継いでいるのに
Module.class
=> Class
Moduleの元になるクラスはClassである。
という関係が直感的に意味不だったので。。
クラス⇔インスタンス Class⇔Module サブクラス⇔スーパークラス Module⇔Class 別の概念である。同じ「class」という単語が使われているが間違えないように。
630 :
tom :2011/01/18(火) 15:16:12
req = Net::
HTTP::Post.new (url.path)
req.set_form_data("aaa=bbb&ccc=ddd")
としてば場合、&、=をurlエンコードしない方法ってありますか?
>>630 set_form_data は Hash を引数に期待する
req.set_form_data({'aaa' => 'bbb', 'ccc' => 'ddd'})
と書けば、キーと値は適切に application/x-www-form-urlencoded でエンコードされ、= と & による連結がふつーに行われる
下手に String#map が動作するもんだからエラーにならんのよね、文字列書いても
送信すべき処置済み巨大文字列が既に手元にあって、再エンコードとか何もして欲しくないという場合は、
適切な Content-Type を指定した上でふつうに post しれ
req.body = 'aaa=bbb&ccc=ddd'
req.content_type = 'application/x-www-form-urlencoded'
力を貸して下さい。 まず、 a=[[aa],[x]],[[bb],[y]],[[aa],[z]],[[cc],[y]] この配列があって、更にそれぞれの要素に対して a[0]=[[ee],[y]],[[ff],[y]],[[ee],[x]],[[gg],[x]] a[2]=[[hh],[y]],[[ii],[y]],[[hh],[x]],[[jj],[x]] となる配列が有るのですが、 このとき " aa " にだけ着目して("x"にだけ着目するパターンもあります) a[0]とa[2]の要素を抽出し、このうちのどれか1つの要素(例えば[[jj],[x]]) を選んで"ans"に代入するプログラムを作りたいのですが、良い方法は無いでしょうか? ans = array[rand(a[0].size)] ans = array[rand(a[[aa],[x]].size)] では片方しか出せないし、 ans = array[rand(a[[aa],[.+]].size)] とか出来たらうれしいのですが。 よろしくお願いします。
(;´Д`)
あまりに率直な反応に朝から盛大にフイタ
いい方法=そんな気持ち悪くネストした配列を作らない というか要素が一つの配列を作るのはなぜ? 変数名だかメソッド名だか知らんが全部が全部抽象化されてるからまるで意味が伝わらん
638 :
デフォルトの名無しさん :2011/01/20(木) 08:10:14
最初の定義に従った a[0] = [aa] a[2] = [bb] とその下のa[0]・a[2]の関係がわからなくなった時点で読むのをやめた。
一行目で読むのをやめた。
>>633 そういう言語じゃねぇから!
ちゃんとクラス分けしたほうがいい。
後は連想配列が使えないか考えろ。
それ以上はレスの内容だけだと何とも言えない。どんなデータが合ってそこから最終的に何を出したいのか書いてくれないと。
「レスの内容だけ」とかじゃなくて、全く意味がわからなかった
これは多分どれだけ抽象的な話を理解できるか試すテスト。
俺は笑い男が仕掛けた罠だと思ったんだけど、違うのか
644 :
633 :2011/01/20(木) 16:19:48
すみません、説明が間違ってました。 aはハッシュで、値とキーが2重配列と配列になっています。 マルコフモデルの会話BOTを作りたいのですが、 詳しい説明文作っていたら一つ思い付いたので、 明日試してきます。
面白いことやってるのかもしれんが、説明する力をもっと養えよ
646 :
デフォルトの名無しさん :2011/01/20(木) 16:40:28
>>644 面白そう
読んだことないけど「恋するプログラム―Rubyでつくる人工無脳」で
紹介されてるような事をやりたいのかな
メールの送信元に「本庄」を指定して送信すると文字化けするが、これを本庄で送りたい。
fromはメールアドレスだけではなく、"本庄 <
[email protected] >"といった感じで差出人名を指定。
また、名前に「刈」を指定すると、from自体が消えてしまう。
環境
ruby 1.8.7
rails 2.3.8
プラグインは
ActionmailerJa
actionmailer_sender_patch
jpmobile
mbmail
という布陣
fromに本庄を指定して送信すると、こんな感じのメールが送られて、文字化けする。
From: =?iso-2022-jp?B?GyRCSz4xGyhC?= <
[email protected] >
To:
[email protected] Subject: =?iso-2022-jp?B?GyRCTDVCahsoQg==?=
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary=mimepart_4d3862eeda92e_6904..fdba898d62b4
Message-Id: <20110120162934.DF71D2CB41@smxxxxxxxxxxxxxxx>
刈という文字が入っていると、そもそもfrom自体が消えてしまう。
マルコフモデルみたいなbot作りたいならライブラリあるし、使ってみて中身覗いてみるとかの方が Rubyに合った作り方学べるしいいと思うよ。 マルコフ連鎖するだけならそんなに難しくないし
そして、ただライブラリを使うだけの自称プログラマが生まれる おれのことだけどな それにそのライブラリがRubyに合った作り方をしてる保証はないだろ
適切なライブラリを探してきて使いこなすだけでもそれはそれで能力のうちだと思う。
能力かもしれないけど能力が高いとは言えないし、 替えという点でもいくらでもきくね。 だから「ヒューマンスキル」みたいな言葉を必要以上に叫んだりするんだろうけど。
よいプログラマはよいコードを書く。偉大なプログラマは よいコードを借りてくる
1. 偉大なプログラマ→よいコードを借りてくる 2. よいコードを借りてくる→偉大なプログラマ 1は成り立つが、2は必ずしも成り立たつわけではない 勘違いするな
なにそのみんながみんな偉大にならなきゃいけないみたいな雰囲気は?
てか不毛な言葉遊びはここでやるもんじゃなかろ
世の中に偉大なプログラマしかいなくなったら 誰がコーディングするの?
集合理論の基本を言葉遊びとかレベル低すぎだろ
>>657 「偉大なプログラマは利用できるものは利用する」ということだろ。
利用するものがなきゃお手上げなのは、なんちゃってプログラマ。
初心者スレでツマンネー雑談してる奴は 2chに張り付きすぎなんじゃね ネタもないのに無理して書きこむこともないのに
「ライブラリ使ったらすぐにできるよね」 っていう人は信用ならない。 ライブラリ叩くだけで終わるような書き捨てコードしか書いた経験のない輩。
ライブラリのバグに直面したり 自分でライブラリ書いたりした経験が無いんだろうね
あったら「すぐできる」なんて言わないだろw
ライブラリで省ける時間なんてキーを叩く回数だけじゃん Ruby使えば一行で済むよって言ってる奴と変わらん
シフトキーの回数が減るなら大歓迎
ライブラリ使うなやって奴は そもそもRubyのような高級言語を使うなよ Cとかアセンブラ使え いや言語から作れよ つーかOSから作れ
head first railsって古いバージョンなの?
だれも使うなとか言ってないと思うのだが
OSを一から作るのあこがれるな。 昔、B-TRONのフリープロジェクトみたいなのあったけど どうなったんだろ?
ウェブブラウザを1から作るのも憧れるよな。 グーグルの広告でもよくでてたじゃん?グーグルが1からつくったとかいうやつ
672 :
デフォルトの名無しさん :2011/01/23(日) 10:44:09
「1から」は叩かれまくったせいか、今は削られてる。
0からならともかく、1からだったら別にいいじゃん
674 :
デフォルトの名無しさん :2011/01/23(日) 13:31:04
WebKitが0一つで賄えるとは思えん。
>>673 序数の「0th」って未だに違和感あるな
677 :
デフォルトの名無しさん :2011/01/23(日) 17:08:09
require 'cgi/session' require 'cgi/session/pstore' で、セッションを使いたいのだが セッションファイルの保存されている場所とか、 セッションファイルの状態を確認するにはどうしたらいいのです?
678 :
デフォルトの名無しさん :2011/01/23(日) 17:14:30
あと、サーバーを丸ごと再起動してからアクセスすると、ログイン情報が消えるっぽくて、毎度ログインしないといけなくなるのはどうしたら防げるのでしょうか?
パスワード無しにするとか
x CGI::SessionかCGI::Session.newがあやしい o CGI::Session::PStoreかCGI::Session::PStore.new
混乱させるなよ x あとはCGI::SessionかCGI::Session.newのtmpdirを再起動しても永続化するパスに変更すればいいんじゃないのか o あとはCGI::Session::PStore.newのtmpdirを再起動しても永続化するパスに変更すればいいんじゃないのか
683 :
デフォルトの名無しさん :2011/01/24(月) 18:24:47
Session::FileStore、 で作ったセッション変数sessをsess.deleteで消すと、/tmpからは 8fff8fcf432c382b のようなファイルがちゃんと消えるのだが、 # apache restart をかますと、 8fff8fcf432c382b 8fff8fcf432c382b.lock のように復活してくるのだが、なぜだ? ブラウザのクッキーは消えてるので、もちろん再利用はできない。 session_expiresで設定した期限を過ぎても残ってる。
684 :
デフォルトの名無しさん :2011/01/24(月) 18:28:17
ついでに Session::PStore でも同様にsess.deleteをした後に/tmpを見ると該当ファイルは消えるが、 アパッチを再起動すると、ファイルのパーミッションが -rw-------8fff8fcf432c382b だったものが -rw-r--r--8fff8fcf432c382b になって復活してる。.lockは生成されないようだ。謎だ。
685 :
デフォルトの名無しさん :2011/01/24(月) 18:41:57
CGI::Sessionは、ファイナライザでストアのcloseを呼ぶようになっていて、 FileStoreではcloseでupdateを実行しているから、このときまた書かれて るのかな。
初心者です。教えてください。
今、「たのしいRuby 第3版」で勉強しているんですが、本にのってるコードがエラーになってしまいます。
なにがだめなのかおねがいします。
ソース↓
require "net/http"
require "uri"
url = URI.parse("
http://www.ruby-lan.org/ja/ ")
http = Net::HTTP.start(url.host, url.port)
doc = http.get(url.path)
puts doc
ここからエラーメッセージ↓
/usr/lib/ruby/1.8/net/http.rb:560:in `initialize': getaddrinfo: Name or service not known (SocketError)
from /usr/lib/ruby/1.8/net/http.rb:560:in `open'
from /usr/lib/ruby/1.8/net/http.rb:560:in `connect'
from /usr/lib/ruby/1.8/timeout.rb:53:in `timeout'
from /usr/lib/ruby/1.8/timeout.rb:101:in `timeout'
from /usr/lib/ruby/1.8/net/http.rb:560:in `connect'
from /usr/lib/ruby/1.8/net/http.rb:553:in `do_start'
from /usr/lib/ruby/1.8/net/http.rb:548:in `start'
from /usr/lib/ruby/1.8/net/http.rb:440:in `start'
from http_get.rb:6
よろしくお願いします。
URLが間違ってるんじゃない
>>687 さんくす!
おいらの3日を1分で解決したあなたに脱帽です。
ありがとうございました!
むしろそんなことに三日気付かなかったお前に脱帽だわ
エラーメッセージが的外れっていうのは良くある
691 :
デフォルトの名無しさん :2011/01/24(月) 20:04:16
的外れというか、知ってなきゃわからないというか。
プログラミングの初歩はエラーメッセージの本当の意味を知ることからだからな
693 :
デフォルトの名無しさん :2011/01/24(月) 20:22:50
まぁ、getaddinfo などのキーワードが出ているのにそれでぐぐったという 報告がない以上、例外メッセージのどこに手がかりがあるかも気付いて いなかった可能性が高いが。
つまりミスプリをした本が一番悪いということだな
695 :
683 :2011/01/24(月) 20:43:02
サーバーを丸ごと再起動した場合は、復活してこないようだ。 # reboot
そうじゃなくてURL間違えてるかもしれないということを三日間一度も思わなかったのがすごいなって言いたかったんだ
>>694 おかしいな、俺の手元の「たのしいRuby 第3版」(第1刷)の149ページではURLはあってるんだが
不親切。初心者が困らないように、 www.ruby-lan.orgもエイリアスにしておくべき。
>>694 の解釈の方向は、いくらなんでもおかしいと思う
YARVとLLVMってどっちが強いの?
696の下では、初心者は伸びないとおもった
日本の夜明けは暗い
Ruby 1.8.7 、環境は Win7 です。 Ruby で HTTP リクエストの PUT と DELETE を実装したいのですが、 net/http でやろうとしたらうまくいかないうえに、 推奨されていません的な警告が出てるような気がします。 このようなことが起こる理由としてなにか考えられることはありますか? また、みなさんはこのようなとき、どのようなやり方で実装なさるのでしょうか? 教えてください。
703 :
デフォルトの名無しさん :2011/01/26(水) 14:59:59
>>702 何したら何が返ってきたか書いて。
405 Method Not Allowed が返ってきてるだけだったりしないよね?
>>702 >>1 くらい読んでくれよ。
> 質問には以下を書くこと。へたくそな質問は再提出を要求される。
> ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
> ・エラーメッセージ(自力で訳さずなるべくそのままで)
> ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
> ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
>>703 >>704 お手数おかけして申し訳ないです…。
以後、このようなことがないようにします。
>>703 Net::
HTTP::Put ってのを使って、他サーバに XML の文字列を渡しているのですが、
data = '<?xml version=〜' ってとこで
warning: Object#type is deprecated; use Object#class
と出ます。
わかる人からしたら「まんまじゃねーか」と言われるのであろうことは
察しがついたのですが、申しわけありません。よろしくお願いします。
>>706 作りかけなので VERIFY_NONE になってたりはしますが、こんなかんじです。
GET と POST も似たようなかんじでやってて、そっちはうまくいってるのですが…。
Net::HTTP.version_1_2
req = Net::
HTTP::Put.new (putUrl)
req.basic_auth(name, pass)
https = Net::HTTP.new(サーバー名, 443)
https.use_ssl = true
https.ca_file = 'c:/openssl/ssl/cert.pem'
https.verify_mode = OpenSSL::SSL::VERIFY_NONE
https.verify_depth = 5
https.start{|http|
data = '<?xml version="1.0" encoding="UTF-8"?>〜'
req["content-type"] = "application/xml"
req["content-length"] = data.length.to_s
response = http.request(req, data)
$putRespXML = response.body
}
インタプリタと仮想マシンの違いってなんなんでしょうか…?
>>707 ここまで聞いた限りでは原因不明
dataに代入してる文字列は、あくまでシングルクォート括りの文字列であって
「実際にはダブルクォート区切りの文字列で式展開(#{〜})してる」とか
そういうこともないんだよね?
だとすると、エラーの原因がさっぱりわからない
疑ってみるとすれば、警告の起こってる行が本当にそこなのかどうか、というぐらいか
710 :
デフォルトの名無しさん :2011/01/27(木) 00:04:34
>>707 Railsアプリを作ってPUTリクエストを投げてみたけど普通に文句も言わず
更新できてるなぁ。(認証入れてないけど)
とりあえず怪しい箇所のアタリをつけて、1行ごとに
$stderr.puts '%s:%d' % [__FILE__,__LINE__]
を挟んで誰がウォーニングを出しているか見てみるくらいしか思いつかない。
Object#type が obsolete になったのはかなーり過去の話だが、
どっかのライブラリに残ってるんだろうかねぇ。
あるいはローカル変数のtypeがself.typeだと解釈されて…これはないか。
ライブラリが古いんじゃ?
712 :
707 :2011/01/27(木) 10:47:40
>>707 です。解決しました。実装できました。
data = のあとの XML の中に定義されていない変数が混ざっていました…。
みなさんに親身に考えていただいたのに、
こんなしようもない原因で本当に申し訳ないです…。
>>709 >>710 本っ当に助かりました!阿呆な理由ですみません…。
どうもありがとうございました。
class ABC に @cost1 @cost2 @cost3 @cost4 というアクセサつきのインスタンスがあったとして def test(index) x = ABC.new case index when 1 return x.cost1 when 2 return x.cost2 when 3 return x.cost3 when 4 return x.cost4 end end これのcostの後ろの数字をindexを参照してreturnしたいのですが 具体的にどう書けばいいのでしょうか? return x.cost + index.to_s ????
>>713 配列で返すとか。
return x.cost1, index
return [x.cost1, index]
↑どちらも同じ
そういうことなのか? 動的なメソッド呼び出しを聞いてるんじゃなくて?
>>713 @costを配列にしろ
caseなんか使わず1行で終わる
__send__でもいけるんじゃないかな? x.__send__("cost#{index}")
719 :
713 :2011/01/27(木) 19:01:12
>>717 氏の
x.method("cost#{index}").call
を採用させていただきましたありがとうございます。
おかげですっきりしました。ちょっと考えたら配列でもいけそうですね。
>>718 氏のやつもぐぐってみます。
Ruby1.9のバイトコードはどういうライセンスになるんだろう。 ソースコードと同じなのかなと思ったけど、他のライブラリのソースコードとごちゃ混ぜ状態になってたりしたら?
今のところ内部形式しかなくてexportできないし、 requireとかincludeしてもごちゃ混ぜにはならないよ。
Rubyに限らない一般的な質問です。 複数のIOオブジェクトがあって、それぞれがアトランダムにreadable, writableになる場合の効率的な処理の仕方についてです。 selectを使うことでreadableあるいはwritableになったオブジェクトを教えてもらうことで シングルスレッドで、それぞれのIOオブジェクトに対して適切な処理を行うことができると分かりました。 mainルーチン → IO.select([object1, object2, ..., objectN]) → 固有の処理 ところが処理対象のIOオブジェクトが有限なら各IOオブジェクト毎に以下のように行うほうがスループットは改善されるのでしょうか? mainルーチン → n.times do thread.new(object) → IO.select(object) → 固有の処理 reactorパターンというものについて調べるとシングルスレッドでの実装例をよく見るのですが、 実際には「固有の処理」の中にIO待ちの要素がある場合はマルチスレッド化させることで多重度を持たせて スループットを改善できるのではないかと考えました。 それとも、IO処理を全て一手に引き受けるスケジューラを作り、 IO処理は全てそこに丸投げしてコールバックするのが正しいreactorパターンなのでしょうか? 「スケジューラにクエリを入れる」という仕組みをどう書けばいいのか分かりません。
>Rubyに限らない一般的な質問です。
┼─┐─┼─ / ,. `゙''‐、_\ | / /
│ │─┼─ /| _,.イ,,.ィ' ─────‐‐‐‐ 。←
>>722 │ | │ | | | イン ,'´ ̄`ヘ、 // | \
__{_从 ノ}ノ/ / ./ | \
..__/}ノ `ノく゚((/ ./ |
/, -‐===≡==‐-`つ/ ,.イ  ̄ ̄// )) / ;∵|:・.
_,,,...//〃ー,_/(. / /ミノ__ /´('´ / .∴・|∵’
,,イ';;^;;;;;;;:::::""""'''''''' ::"〃,,__∠_/ ,∠∠_/゙〈ミ、、
/;;::◎'''::; );_____ @巛 く{ヾミヲ' ゙Y} ゙
≧_ノ __ノ))三= _..、'、"^^^ \ ! }'
~''''ー< ___、-~\( ,' /
\( ,'.. /
rails含めてのruby開発環境ってやっぱり eclipse+なんかプラグインが一番いいの?
>>722 どちらの方式が良いかはケースバイケースだが、Rubyの場合は
マルチスレッド方式のほうが優れたパフォーマンスになるケースが多い。
一般にIOオブジェクトのI/O操作メソッドは、その操作が完了する迄、
リターンしない(=ブロックされる)。この様な一般的なケースでは、
シングルスレッド&select方式だとそのI/O完了待ち時間がネックになって、
CPUは空いてるのにシステム全体としてのスループットが頭打ちになる。
マルチスレッド方式では、あるスレッドがI/O待ちになれば他のスレッドへ
自動的に切り替わるから、CPUを有効に活用できる(無駄な待ち時間が無い)。
逆にselect方式が性能上で優位になるのは、標準のスレッドスケジューラの
オーバヘッドすら問題視されるような、性能要求に対してシビアな環境。
Rubyは、そんなシビアな環境下でのプログラミングには不適な軽量言語。
現実のサーバソフト設計では、システム全体はマルチスレッドで動かし、
個々のスレッド内で複数のI/Oを扱う場合にselectを用いるという、
第三のハイブリッド方式が採用されるケースが多いのではないかと思う。
例えばWebサーバなら、個々のワーカースレッドで、ネットワークからの
リクエスト受信待ちとディスクへのリード完了待ちをselectで同時に監視する。
>>725 Ruby 1.8についていえば、スレッド切り替えがクソ重すぎて使い物にならない。
C10KどころかC1Kでも100ms毎にデータが飛んできたらスレッド切り替えだけで
CPUを使い果たす。
728 :
デフォルトの名無しさん :2011/01/29(土) 09:21:35
>>724 とりあえず先端を走っているような人はエディタとターミナルでやってる。
729 :
デフォルトの名無しさん :2011/01/29(土) 09:23:09
>>724 俺も現時点ではNetBeansが良いと思う
Eclipseは動作がやや重く、インターフェースがわかりにくいという印象
しかしRDEは完全に更新止まっちゃったな
731 :
デフォルトの名無しさん :2011/01/29(土) 09:39:47
NetBeans IDE 7.0からRuby on Railsのサポートを廃止
利用者少ないし忙しいからRailsは切るわ、ってことか
Eclipseの後追いは止めたのか、 それともオラクルマジック発動か。 はたまた…
735 :
722 :2011/01/29(土) 10:42:19
>725 大変勉強になりました。 「第三のハイブリッド方式」というのが私のケースでも最適に思えるので、複雑で頭が混乱しそうになりますが 設計レベルからもう一度書き直してみます。 # LLに親しむとプログラミングが楽しくなる反面、安易にコードを書き散らさない慎重さが必要だと感じます。
もう未来が無いとしても、現状NetBeansより万人におすすめできる Ruby開発環境ってないしな
ローカル変数とメソッドが紛らわしくてたまに困ります。 メソッド呼び出しは全てに()をつける、というのはありでしょうか?
738 :
デフォルトの名無しさん :2011/01/29(土) 11:54:08
>>737 それで見やすくなるのならそうすればいいけど、
人のコードを読むのは楽にならないぞ。
>>725 「第三のハイブリッド方式」で言う「マルチスレッド」って Ruby (のグリーンスレッド) でも可?
>>739 操作対象のI/Oオブジェクトをワーカースレッドがselectで監視(待機)できるならば可能。
原理(考え方)としてはC(のPOSIXスレッド)もRuby1.8(のグリーンスレッド)も同じ。
たとえばネットワークなら、標準のSocketクラスは(selectで)監視できる。
DBなら、PostgreSQLだと拡張ライブラリ側で非同期I/Oメソッドが提供されているから、
それを使えば(selectで)監視できる。ファイルだと現状は無理だけど、
たとえばLinux AIO(非同期I/O)を拡張ライブラリとして「自力で実装できれば」可能になるだろう。
ただし、Windowsの場合にはWinSockのselect関数の実装が(Ruby1.8のスレッドスケジューラ以上に)
あまりにも糞重すぎる代物だから、サーバ向け処理には(性能面で)「まるで」使い物にならない。
UNIX系であれば、C0.1KクラスならRubyでも「程々に」使える。C0.1Kクラスは最大100台程度だから、
部門サーバ/個人サーバの規模になるわけで、「そこそこ」適用範囲は広いと言えると思う。
性能問題はシステム問題の一つだから、絶対的な一般解というのは存在しない。
>>425 の冒頭で書いたように、ケースバイケースで対応(設計/実装方式)を判断・決定すべきだろう。
>>737 それ、むしろRubyのメリットのはずなんだが
変数かメソッドかを気にしなきゃいけない状況からなんとかしたら?
メソッド呼び出しにselfとかレシーバーつけるとか
ローカル変数かメソッド呼び出しかわからないということは、 一つのメソッドが大きすぎるんじゃないの?
744 :
722 :2011/01/29(土) 18:08:15
>>725 の第二の方式について考えていました。(スケジューラ方式?)
>>717 のやり方を参考にすれば動かせそうに思えたので。
selectに渡せるものがIOのサブクラスだけなので、
スケジューリングというものをイベントを文字列としてパイプに突っ込むことで表現して、
FIFOでそれを取り出して処理するようにしてみました。
イメージとしては
1. クライアントがリクエストを送信
2. サーバのソケットに貯まる
3. IO.selectで受信して、リクエストをイベント化してイベントキューに登録
4. selectしてイベントキューにイベントが入っていればそれを取り出して処理
5. 処理の一部をイベント化して再度、イベントキューに登録
6. 以上をループ
実際のコード:
http://codr.cc/FB0CA8BB04 こういう実装が実用的なのか、性能が出るのか、などについて教えていただけるとありがたいです。
あと、文字列をパイプに入れるのはダサイので他のやり方があれば…。
745 :
240 :2011/01/29(土) 18:47:42
まずはRubyのスレッドやRevやEventMachineで実装してみては。 自作するのはそれでだめなのがわかってからでもいいかと。
>746
>self.__send__(*str.chomp.split(","))
そういう書き方もできたんですね。参考になりました。
アドバイスに従い、Queueライブラリとthreadを使って>725の「第三の方式」を書いてみました。
実際のコード:
http://codr.cc/C3719FF560 1. socket listen専用thread
2. リクエスト処理専用thread
3. socket write専用thread
の3つを作り、他threadからイベントを受け取りうる2つのthread(2.と3.)にQueueオブジェクトをあてがいました。
「第二の方式」に比べるとIO待ち時間を無駄にしない点と実装が単純になる点で優れていて、
スレッドコンテキストスイッチが発生するというデメリットがあると思います。
実際にはthread poolingを使って各threadを最大n多重できるようにしたほうがスループットを向上できるんでしょうね。
>747
thread間でのイベントの受け渡しをRevやEventMachineがどう実現しているのかをこれから参考にしてみます。
まずはこういうロジックを自分で書けるだけ深く理解することが今の目標です。
最終的にはSEDAアーキテクチャの劣化版くらいは書けるようになりたいです。
binmode設定するとエンコーディングがASCII-8BITになるのはバグですか?
どこがバウやねん
バグ 正確には仕様変更の未反映 本来あるべき動作は以下のとおりだけど現状ではIOのエンコーディングに影響しASCII-8BITになる るりま曰く > binmode > Windows の IO にはテキストモードとバイナリモードという2種類のモードが存在します。 > これらのモードは上で説明した IO のエンコーディングとは独立です。改行の変換にしか影響しません。 ruby-dev:36827 辺り参照。
>>749 それは正常な動作です
p 'foo'.force_encoding('BINARY').encoding
# => #<Encoding:ASCII-8BIT>
ASCII-8BIT と BINARY は同じ意味
で、あってるのかな?
753 :
749 :2011/01/31(月) 19:28:11
自己解決しました
754 :
752 :2011/01/31(月) 19:30:11
仕様だよ バイナリファイルの読み込みに支障が出たからあえてASCII-8BITにした るりまは間違い
このあたりはかなりケンケンガクガクだったような気が
カンカンガクガクまたはケンケンゴウゴウのいずれかをお使いください。
いや待て。バイナリファイルの読み込みはエンコーディングの影響を受けないそれ用のメソッドがあるから IO自体をASCII-8BITにする必要はない。 支障があるとすればバイナリファイルをテキスト読み込みメソッドで読んだ場合だけど それ自体がおかしいから考慮しなくていい。
ruby1.8.7[i386-mingw32](Ruby Installer)、Windows で開発しています。 テキストをファイルにUTF-8で出力したいです。 例として、テキストファイル(中身はSJIS)を読み込んで、別のファイルに内容は同じで UTF-8で出力するプログラムを書きました(ソースの文字コードは SJIS)が、あってますか? require 'nkf' inFileName = ARGV[0] # 入力ファイル名 outFileName = ARGV[1] # 出力ファイル名 outFile = open(outFileName, "w") open(inFileName, "r") {|file| while line = file.gets line = NKF.nkf("-Sw", line); outFile.puts line end } outFile.close java だと以下のように、ファイルハンドルを開くときに文字コードを指定し、そこに書き込んだ内容は、自動的にその文字コードになります。 FileOutputStream fos = new FileOutputStream(outFileName); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw); pw.println("あいうえお"); Ruby 1.8系の場合は文字列は単なるbyte列であり、入力のテキストファイルから読み込んだ文字列はShiftJISのバイト列です。 そのバイト列に対して NKF ライブラリで UTF-8 のバイト列にした後で、 出力ファイル用のファイルハンドルに書き込むと、write はそのバイト列をそのままファイルに格納するだけ、と理解しました。 他に正しい方法があれば教えてください。
NKFはやめとけ
文字コードはいっつも頭痛くなる。認識変更が簡単にできるライブラリとかできねーのかな?
下記サイトを見て思ったのですが、単に引数aとbが指し示すオブジェクトを変えただけ
で(a = a + 1)、実引数のほうは変化していないので値渡しだと言っているのには
ちょっと違和感を感じます。
後述に、Arrayオブジェクトを例に出して、参照の値渡しの話をしていますが、
これだと、まるでFixnumオブジェクトの場合は、同じ値の新しいオブジェクトを作って
それを渡す値渡しで(Fixnumでは値が同じで異なるオブジェクトというのはない気はしますが)、
Arrayオブジェクトだと参照の値渡しになると言っている感じがします。
まだRubyを学び始めて間もないので、私の勘違いかもしれませんが、皆さんはどう
思われますか?
Rubyist Magazine - 値渡しと参照渡しの違いを理解する
http://jp.rubyist.net/magazine/?0032-CallByValueAndCallByReference def foo(a, b) # a, b を「仮引数」という
a += 1
b += 2 # a と b を変更する
end
x = 10
y = 20
foo(x, y) # x, y を「実引数」という
puts x #=> 10 # 変更されてない
puts y #=> 20 # 変更されてない
> 下記サイトを見て思ったのですが、単に引数aとbが指し示すオブジェクトを変えただけ > で(a = a + 1)、実引数のほうは変化していないので値渡しだと言っているのには > ちょっと違和感を感じます。 なぜどのように違和感を感じるのでしょうか。 それが値渡しなのですが。
fixnumもオブジェクトのはずなのに、なぜ値型の値渡しみたくなってるかって疑問? 数値型がイミュータブルだからとかそういう話なんじゃないかな知らんけど
左辺渡し右辺渡しって呼ぼうぜ!
PHPはすごいなあ function hoge($arg) { $arg[0] = 1; return $arg; } $arr = array(); $arr[0] = 0; $ret = hoge($arr); var_dump($arr); #=> 0 var_dump($ret); #=> 1
つまりどういうことです?
>>763-764 >>764 さんのおっしゃる通りです。
そのサイトではメモリ図を用いて説明されていて、仮引数に渡すときFixnumだとC言語のように
そのコピーが作られて(新たなオブジェクトを作るということでしょうか?)、Arrayだと
参照の値渡しだと言ってます。
しかも、Fixnumはイミュータブルなのに値を変化させたと書いてあります。
私の認識では、a = a + 1というのは、a + 1という新たなFixnumオブジェクトを作って、その
オブジェクトをaが指し示すというもので、値を変化させるというものではないと思ってました。
Rubyは数値も含めて全てがオブジェクトとうたわれているので、ArrayだろうとFixnum
だろうと同じような扱いをするのだと思っていたから違和感を感じました。
すなわち、ArrayやFixnumを含む全てが参照の値渡しだと思っていたということです。
実は、Fixnumのような数値はいわゆる値型のように実装(ふるまうと)されているということでしょうか?
それとも私の認識(もしくはこのサイトに対しての私の読解)にどこか間違いがあるのでしょうか?
>>768 > それとも私の認識(もしくはこのサイトに対しての私の読解)にどこか間違いがあるのでしょうか?
結論から言うと Yes。
Ruby は、Fixnum だろうと Array だろうと「値渡し」。
まず Fixnum のような、配列じゃない場合は、値渡しになることは理解していると思う。
Ruby の Array は何を保持しているかというと、配列の先頭のアドレスだけを持っている。
(配列の実体を直接持っているわけではない。C言語での、char と char* の違いと同じ)
そしてメソッドに Array を渡すと、メソッドを受け取った側(仮引数)では、アドレスがコピーされている。
メソッドの呼び元の Array と、メソッドの中の Array の実体はそれぞれちがうものであり、
配列の先頭アドレスを、2重に持っていることになるので、「値渡し」ということができる。
※先頭アドレスを二重に持っているものの、それぞれが同じ場所を指しているので、
配列の実体(
>>762 のるびまでの、[10, 20])は1つしかない。
>>769 お前はそもそも値型/参照型の値渡し/参照渡しの計4通りあること理解してるのかと小一時間
>>768 あなたの解釈は概ね合っているんじゃないかな。
ただ、内部の実装については知らないのかも。
Fixnumなどの一部のクラスのインスタンスも「見かけ上は」他のオブジェクトと同様であるかのように振る舞う。
「見かけ上」であって、内部的には即値の処理に解釈されている。
でもそれによってRuby上での扱いが変わるということはほとんど無い。
強いて言えば、状態を変更するような動作はできない、という程度。
でもその「状態を変更できない」のがポイントで
「状態を変更出来ない、同じオブジェクト」への参照をコピーするということは
変数の値そのものをコピーすることにほぼ等しいワケ。
だって参照の値と扱う値は1対1に対応するんだから。
そのサイトの説明は若干はしょってるというか、細かい話を避けてるんだろうけど
強ち間違った説明かと言うとそういうワケでもないよ。
オブジェクトの中身を操作するからややこしくなる def foo(a, b) # a, b を「仮引数」という a = a + b # 仮引数aの指すオブジェクトに同bを足したものを仮引数aに再代入 end a = 1 foo(a,1) p a # => 1 #当然変化なし b = [10,20] foo(b, [1]) p b # => [10,20] #もちろん変化なし
>>765 それが多分一番混乱しないんだが、
まず左辺値右辺値とは何かがわかってないとわかんない。
>>770 値渡し、参照型の値渡し、参照渡しの計3通りだよね?
>>771 Fixnumのようなクラスは、値型のように実装されているということならこのサイトの説明も
納得です。
ただ、Rubyは全てがオブジェクトだとうたっているので、実装上そうなっているとはいえ、
値型のようなふるまいの説明をするのはどうかなとは思いますが。
だからrubyは全部値渡しだっつってんだろバカかおめー
納豆が Ruby サポート終了するけどおまいらどうすんの?
>>775 るびまはるびま(雑誌)でしかない。一般人向けに直感的に分かりやすい表現をしているのではないかと。
仮にRubyに公式な言語定義書というものが存在して、その中での記述であれば問題がもしれないが....。
779 :
デフォルトの名無しさん :2011/02/02(水) 22:15:11
>>777 もともと使ってないからなんともならない。
え、NetBeansがサポート終了するのってRailsだけじゃなかったの?
>>775 引数の渡し方を理解する上においては、Fixnumが即値がどうかは特に関係がない
Fixnumが即値であろうがなかろうが、結論は同じで、Rubyの引数は値渡しだよ
NetBeansにとってRubyはRoRの一部に過ぎないのでは。
>>775 >Fixnumのようなクラスは、値型のように実装されているということならこのサイトの説明も
>納得です。
「値型」って何のこと?Javaでいうプリミティブ型のことかな。
Rubyは全てがオブジェクトだけどFixnumの実装はポインタに整数値を埋め込んでいるのは確か。
でもそう実装になっていることと、引数が値渡しであることは関係がない。
>ただ、Rubyは全てがオブジェクトだとうたっているので、実装上そうなっているとはいえ、
>値型のようなふるまいの説明をするのはどうかなとは思いますが。
勘違いしているなあ。
Fixnumだろうが、それ以外の通常のオブジェクトだろうが、Rubyでは値渡しであり、
どちらの場合でも同じふるまいなんですけど。
なぜそんな勘違いをしてしまったのか知りたい。
Javaのオブジェクトは参照渡しとかいう謎の都市伝説に騙されてたとかじゃないの?
値型/参照型って話がなんで値渡し/参照渡しに? 勘違いしてるのはどっちだ
そもそも「値型」「参照型」って何?
何この痴呆症滴ループ 自分でサンプルコード書いてobject_idチェックしろ 質問者はド素人じゃないっぽいしそれくらい出来るだろ
Rubyは参照の値渡しだろ? PHPは値渡しで、&をつけると参照渡し じゃね?
>>762 def foo(a, b)
a += 1
b += 2
end
x = 10
y = 20
foo(x, y)
p "x = #{x}" #=> 10 # 変更されてない
p "y = #{y}" #=> 20 # 変更されてない
c = x
d = y
c += 1
d += 2
p "x = #{x}" #=> 10 # 変更されてない
p "y = #{y}" #=> 20 # 変更されてない
p "c = #{c}" #=> 11 # 変更されてる
p "d = #{d}" #=> 22 # 変更されてる
>>786 が言及しているけど、質問者はFixnumが値型なのか参照型なのかを聞いているのに
値渡し/参照渡しの回答をしている人が多いね。
質問への回答でなく単に値渡し/参照渡しの話をしたいだけかもしれないけど。
質問者の質問の仕方が悪いのと、引用したるびまの記事が値渡し/参照渡しについての説明
というのも影響しているんだろう。
>>792 >PHPは値渡しで、&をつけると参照渡し
PHPは知らないが、Cの場合は全てが「値渡し(call by vale)」。
変数の前に単項演算子 & を付けると、その変数のアドレス値(ポインタ値)を得えることができるし、
それを関数の引数として渡すこともできる。(たとえば f(&x) など)
けれどその場合もアドレス値を「値渡し」しているのであって、
それを「参照渡し(call by reference)」とは言わない。
ただし、Cだけを語る文脈の中で、その「アドレス値の値渡し」のことを「ポインタ渡し」と呼ぶことがある。
C限定の文脈であれば、「ポインタ渡し」という用語は間違いではない。
でも、Cのポインタ渡しが「参照渡し」と混同して解釈されがちなのは事実で、注意して用いるべき。
繰り返すけど、これはCの場合。PHPは知らないよ。(同じかもしれないし、違うかもしれない)
>>794 質問者への返答としては、
>>791 が FA(Final Answer) でいいんじゃないかと。
まとめると、Rubyの場合は、原始的(primitive)なオブジェクト(たとえばFixnum)は
即値(immediate value)であり、それらはメソッド呼び出しの際には値渡し(call by value)される。
その他のオブジェクト(たとえばArray)は即値ではなく、
メソッド呼び出しの際にはオブジェクトへの参照が渡される。つまり参照渡し(call by reference)される。
Cとは異なり、純粋OOPであるRuby(あるいは元祖であるSmalltalk)には、
アドレス(ポインタ)という概念がそもそも存在していないことに注意すべき。
C++やJavaのように、手続き型言語に後付けでOO機能を継ぎ足した言語は、
アドレスと(オブジェクトへの)参照が複雑に絡み合っているので、(厳密な意味論の)解釈は非常に難解なものになった。
ただし、だからといって、そんなC++/Java流の解釈をRubyに当てはめようとするのは無茶苦茶であるとしか言えない。
# 率直に言って、「Rubyはすべて値渡しである」と間違った自我流の解釈を押し付けようとする
#
>>776 ,784のカキコ(同一人物?)は迷惑に感じる。(ぶっちゃければウザイの一言)
「即値」の使い方でお里が知れる
radrails入れたら、普通のruby開発もできますか?
>>796 全然間違ってるよ。Ruby においては、
オブジェクトに原始的(primitive)かどうかなんて区別はない。
> Cとは異なり、純粋OOPであるRuby(あるいは元祖であるSmalltalk)には、
> アドレス(ポインタ)という概念がそもそも存在していないことに注意すべき。
んなことはない。むしろ Java より Ruby のほうが C の思想を引きずっていると思う。
むしろ
>>769 あたりが FA なんじゃないかと。とはいえ
>>794 の通りかも知れないけど。
801 :
796 :2011/02/03(木) 13:03:36
>>800 >んなことはない。むしろ Java より Ruby のほうが C の思想を引きずっていると思う。
その「JavaのほうがRubyよりもOOPらしい」というところをkwsk
全体的に、否定形の文体(.... ではない)に終止している感じがする。
XXXデハナイ(XXXは誤りである)で終えずに、YYYデアル、あるいはZZZデアルのほうが、前向きな議論ができると思う。
>>769 のような(C++/Java流の)値渡しによる解釈はC++/Javaに慣れた人にとっては自然かもしれないけれど、
それをアドレス(ポインタ)という概念が存在しないRubyに当てはめようとする考え方そのものに無理がある、
というのが
>>796 の要旨。
自分としては、正直C++/Javaには詳しくないし、
>>791 の解説を一からひっくり返してくれる解釈があれば、すごく嬉しかったりする。
802 :
800 :2011/02/03(木) 13:19:33
>>801 Java のほうがRubyよりOOPらしい、なんて一言も言ってないよ。
Ruby のほうが C の思想を引きずっていると書いた理由は、言語仕様ではないが、
Ruby のライブラリが C の関数と同じオプションを受け取れたりするところ。
(たとえば open() の第2引数(mode) とか、NKF とか)
PHP も Cの関数のラッパになっていることが多いが、Ruby も似ているので、
「これを呼ぶと C のあれが呼ばれるんだな」と感じることが多かったので、「C を引きずっている」と書いた。
「引きずっている」と書いているけど悪いと言っているわけではない。
> 全体的に否定形の文体・・・・
ここは私の力不足なところもあるが、
Ruby には、Java のような primitive 型とオブジェクトの区別がなく、すべてが
オブジェクトなのだから仕方がない。
そのオブジェクトが immutable かそうでないかというのはあるけど。
>>801 自分もRubyを使うだけで、内部のことまで考えたことはないんだけど、、、
>>791 でFixnum等が実装では即値扱いになっているのは、イミュータブルだから即値として扱っても
オブジェクトとしての性質が保たれるのと、パフォーマンスの問題もあるんではないだろうか?
例えば、Fixnumをオブジェクトとして実装するとGCの回収が必要となり、速度的な問題を生じるとか。
(即値だとGCがいらないかとか知らないけど)
他の実装はどうなんだろうか?
JRubyやIronRubyもCRubyと同じような実装なんだろうか?
>>791 では即値でない実装があっても構わないと書いてあるし。
>>802 ファイルオープンのモードはJavaでも引きずってなかったっけ?
最近は違うのかも知れんけど。
分かったから初心者スレでやるなよ。
>>801 「値渡し」「参照渡し」はプログラミング言語一般の引数の渡し方を説明するための用語であって
Ruby内の引数の渡し方を説明するためだけの用語ではない。
「Rubyに当てはめようとする……」という指摘がそもそも無理筋。
こういう流れって例外なく不毛だよな
raise
rescue
ensure ループする話も必要
ちょっと疑問におもったんだが、参照の値渡しでもポインタでもない、これぞ参照渡しな言語ってどんなんがある? できればメジャーなやつで あと参照の値渡しとRubyの値渡しは何が違う?
> ちょっと疑問におもったんだが、参照の値渡しでもポインタでもない、これぞ参照渡しな言語ってどんなんがある? > できればメジャーなやつで C++
なぬ、Cは値渡しなのにC++は参照渡しなの!?
&
たしかこんなかんじ $ cat ref.cpp #include <stdio.h> void foo(int &x) { x++; } int main(void) { int a = 774; foo(a); printf("%d\n", a); return 0; } $ gcc ref.cpp && ./a.out 775 参照渡しでは、仮引数 x が実引数 a の別名として機能する
>>811 自分が知る範囲ではPerl,PHP,VB6,VB.NET/C#/C++はサポートしてる
VB6はデフォルトで参照渡し
C++/VBNET/C#はデフォルトが値渡しだが参照渡し用構文がある
Perlは参照渡しも値渡しも可能。
PHPも参照渡し可能。詳細忘れた
Cは直接サポートしてないが参照渡しのエミュレートは出来る
さっき初心者スレに書いたが元ネタはこのスレか
参照の値渡しとかわかりづらい表現をするからややこしくなる
ものすごくわかりやすいです
>>817 参照渡しとごちゃ混ぜになるよりは相当マシ
>>815 そういうのrubyでどう書くのか悩んだわ昔
>>794 最初の質問である
>>762 を見る限りでは
値渡しと参照渡しについて質問してるとしか思えない
>>762 のリンク先は卑怯だな
あたかも値のようにしか見えない例と
あたかも参照のようにしか見えない例しか乗せてないし
class Fixnum; attr_accessor :a;end
def fn1(m); m = 456; end
def fn2(m); m.a = 456; end
def fa1(b); b = [4, 5, 6]; end
def fa2(b); b[0] = 0; end
n = 123
fn1(n) # 変更されない
p n # => 123
a = [1, 2, 3]
fa1(a) # 変更されない
p a # => [1, 2, 3]
n = 0
n.a = 123
fn2(n) # 変更される
p n.a # => 456
a = [1, 2, 3]
fa2(a) # 変更される
p a # => [0, 2, 3]
ってかFixnum普通(?)にインスタンス変数持てるんかいw
>>822 変数がさすのはあくまでオブジェクト
n = 123
p n.object_id # => 247
fn1(n) # オブジェクトは変更されない
p n.object_id # => 247
a = [1, 2, 3]
p a.object_id # => 5839984
fa1(a) # オブジェクトは変更されない
p a.object_id # => 5839984
n = 0
n.a = 123
p n.object_id # => 1
fn2(n) # オブジェクトは変更されないが、その内部はメソッドコールによって変更される( Fixnum#a= メソッドによって )
p n.object_id # => 1
a = [1, 2, 3]
p a.object_id # => 5839168
fa2(a) # オブジェクトは変更されないが、その内部はメソッドコールによって変更される( Array#[]= メソッドによって)
p a.object_id # => 5839168
はいはい即値即値 class Fixnum; attr_accessor :a;end a = 1 b = 1 a.a = 99 p b.a #=> 99
値渡し: 値がコピーされる 値の中に含まれる「ポインタ」や「参照の値」を使って 参照先への操作をしない限り、呼び出し元への影響はない 参照渡し: 変数そのものが渡される 呼び出し先での仮変数への代入は、呼び出し元の変数への代入と同義になる 参照の値渡し: 「参照の値」がコピーされて渡される その参照先への操作は呼び出し元に影響するが 仮引数そのものへの代入は、単に参照先が書き換えられるだけで元環境に影響しない
参照渡しの欄間違えた ×仮変数 ○仮引数
>>821 その後の質問(
>>768 )で、質問者がFixnumが値型/参照型なのかを聞いているのがわかったけどな。
>実は、Fixnumのような数値はいわゆる値型のように実装(ふるまうと)されているということでしょうか?
その質問以降でも、値渡し/参照渡しのレスをしている人が多くいるってことは、質問者の質問
の仕方が悪かったのは否めないけど。
>>811 Pascal, Modula-2
使ったことないから知らないけど、Delphiってやつもそうか?
>>796 ここ最近のスレで「Rubyは値渡しじゃない」という独自の解釈を押し付けようとしているのは同一人物なのか?
ここは初心者スレなんだから混乱させるのはやめろよ
あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ
他の言語では
>>815 のように参照渡しがサポートされているがRubyは違うだろ
>>817 「参照の値渡し」がややこしいなら、単に「値渡し」でいいよ。
Java、C#でclassをnewして、特に参照渡しだと指定せずにメソッドの引数に指定するとそれは「値渡し」だよね
参照を「値渡し」するのは今時の言語では珍しくない方法じゃないのかな?
作者自身(Matz)がRubyは値渡ししかありませんって言ってるんだから、あるとしたら バグか他の実装でしょう。
創造神まっつと
>>796 のたたかいが、いまはじまる
もしかしてPerlって参照渡ししかないんじゃないの? だからいちいち関数に入ったところでコピーを作るんだよね?
たった一か月前のしかもこのスレの話題を繰り返すおとこのひとって…… 参照という言葉の認識の違いですれ違ってるところまで同じかよ とりあえず「オブジェクトそのものは渡してません」でいいじゃないか
「渡す」の定義からしないとな
コピーコンストラクタが走ってうんちゃらみたいな話はC++でこりごりよ
>>827 それ単に混同してるだけじゃね?
まあ本人から説明を聞かないことにはわからんけど
837 :
836 :2011/02/05(土) 00:44:14
ここでの混同は、「最初の質問者が」混同してるんじゃないかってことね
基本的には、動的にしかクラスのインスタンスをつくることができない言語は当時は英断だと思ったが、 # クラスがnewしかできないいくつかの言語ね さすがのC++のカオスをしった前には、あれは英断だったんだなと思わざるをえなかった C++の動的生成と静的生成わかれているのは、殺すためのハンター試験じゃないのかと
てかさ、こういう定義の話題みたいなのはお前ら、コードでかけないのか?
俺の解釈、お前の解釈なんてしったこっちゃねーんだよ。
コンピューターのようにコードを出して、そのままの解釈をさせるようにかんけつに書け
というわけでお前らの「値渡し」と「参照の値渡し」「(あと
>>796 のなんだっけ?w)」
定義のコードをかけ。来てるのがRubyistじゃないならRubyじゃなくてもいい
kill -KILL 840
ガラケー案件ダル過ぎる… 300万程度の案件が1ヶ月ぐらいかかったわ もう絶対にやらん
>>829 俺は796じゃないけど。
> あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ
この値渡しというのは、参照の値渡しではない値渡しのこと?
もし、そうなら
ary1 = []
ary2 = ary1
ary2.push "hoge"
p ary1 #=> ["hoge"]
で終了だよね。
そうじゃないなら、
>>796 が間違ってるよね。参照渡しと参照の値渡しを混同してるだけ
っぽいけど。
即値はこの例がわかりやすい。
x = 100
y = 100
p x.object_id == y.object_id #=> true
即値の場合は参照の値渡しではなく、普通の値渡し。
追記
>>817 参照の値渡しという言葉は必要。初心者にはだるいだろうけど、覚えてもらうしかない。
値渡しと参照渡しと参照の値渡しが区別できないと、激しく混乱することになる。
色々と落ち着け
846 :
844 :2011/02/05(土) 08:23:59
>>845 え?落ち着いてるよう。眠いけど。寝る。
> > あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ > この値渡しというのは、参照の値渡しではない値渡しのこと? > もし、そうなら > > ary1 = [] > ary2 = ary1 > ary2.push "hoge" > p ary1 #=> ["hoge"] > > で終了だよね。 どこが? > Rubyは値渡しじゃないという例 ということは、参照渡しだという例を見せてくれ、ってことでしょ。 それのどこが参照渡しの例なの?
848 :
デフォルトの名無しさん :2011/02/05(土) 08:50:35
自分自身の確認の為に。参照渡しって a = "hoge" b = a b = "hage" p a #=>"hage" ってことだよね?aが指し示してるところをbに渡すんだから
>>848 ちがうお
なんちゃら渡しは関数の実引数と仮引数の関係を説明する言葉
その例では関数が出てきていないのでなんちゃら渡しは問題にならない
>>843 >即値はこの例がわかりやすい。
>x = 100
>y = 100
>p x.object_id == y.object_id #=> true
その例では即値かどうかはわからないよ。実際は確かに即値なんだけれども
「100という定数名があり、そこには予め
『数値の百が設定されたFixnumオブジェクトのインスタンス』
への参照が入っている」とでも表現すれば解るだろうか。
要するにそういう定義だったとしても同じ結果になってしまうんよ。
>>848 関数もしくはそれに相当するもの(Rubyではメソッド)が出てこないと説明できない。
def f(x)
x = 127
end
v = 743
f(x)
p v # => 真の意味で「参照渡し」ならば 127 になるが「参照の値渡し」であるRubyでは 743 のまま
> 100という定数名があり こんな実際にはできないたとえを持ち出したら もうめちゃくちゃなのだが
>>848 def hoge(x)
x = [3,4,5]
end
a = [0,1,2]
p a
hoge(a)
p a
もし関数hogeでxが参照渡しされていたら、2回目の表示が[3,4,5]になる
>>852 んじゃ「リテラルがすべて同様の値を持つインスタンスへの参照だったら」とでも書けばいい?
そうか冬休みか
>>851 同じ挙動を実現できているってこと
参照渡しのルールは、渡された変数名が、元々の変数を表すかのように振舞うこと
例で何をやってるかって、メソッド呼び出し元から
変数名と変数実体との対応表(binding_obj)を受け取って、
それのもとでevalしてるだけ
こんだけ初心者が混乱してるってことは るびまの記事がちっともわかりやすくなかったということか しくしく
いや同一じゃないな、やっぱ同様…じゃなければ何と表現すればいいんだ 100という数値そのものではなく、100という数値のオブジェクトのことを
最近の Ruby 案件見てると往年の VB みたいになってきたな。
一般に参照渡しをRubyみたいなcall-by-sharingの言語で実現するには
ジェネリクス的なものまたはObject型なんかを使って
仮にPBR(pass by reference)というクラスにその型の変数を持たせ
swap(new PBR(a),new PBR(b))とやるしかないのではと思っている
ecmascript(javascriptやactionscript)に参照渡しは無いが
a.hogeとa["hoge"]が同じ意味をもつので
PBRはこれで代用出来る
actionscript3.0はTypedになってこの方式と相性悪くなってしまった
>>861 Readonlyな変数を参照渡ししようが値渡ししようがセマンティクスに影響はないので
あまり悩んでも意味は無いし
>>791 でFixedNumの実装が即値でも参照でもいいってのはそういうことだと思う
1の値を2に書き換えて既存の1+1を全て2+2にしたいわけじゃないんでしょ?
即値のほうが効率は良いから
Rubyに即値という概念はないだろう ただオブジェクトというものがあるだけ 変数はオブジェクトへの参照を格納してるだけ メソッドコールするとそのオブジェクトへの参照を値渡ししてるだけ Fixnumのように同じ表現だと常に同じオブジェクトを返すようなクラスは定義できるよ class Foo @pool = {} def self.new(n) return @pool[n] if @pool[n] @pool[n] = super end def initialize(n) @n = n end attr_accessor :a end a = Foo.new(1) b = Foo.new(1) a.a = 99 p b.a #=> 99 p a.object_id == b.object_id #=> true
もうmatz神が直々に聖書をお書きになれば良いのでは。
はい終了
Rubyのコーディングスタイルについて教えてください。 メソッド呼び出し時に、レシーバを省略すると変数と紛らわしいという問題に対して、 常にレシーバを付ければいいという主張をする人もいるようですが、 Ruby習熟者の方が良しとしているのはどういうスタイルでしょうか。 常にレシーバを付ければいい、という主張に従うと、 単純にインスタンス変数にアクセスする際にもselfが付きまとうことになり 逆に可読性が落ちるように思います。 アクセサメソッドだけ例外にして他のメソッドにのみレシーバを付ける、 なんてルールを作ってしまうと更に悲惨なことになりそうです。 やはり省略できるものは省略してしまう方がスッキリするんでしょうか。
インスタンス変数は直接アクセスする
>>869 命名が不適切なのかもしれない。リファクタリングを検討
通常、動詞的な命名をされるはずのメソッド名と、
名詞的な命名をされるはずの変数名(アクセサメソッド名)は混同されない
>常にレシーバを付ければいいという主張をする人もいる
初耳
>>869 個人の好みにもよると思うが、レシーバは必要なければ
可読性のために省略する方が多数派
確かMatzもそっちを推奨してたと思う(ソース不明)
俺は、「レシーバを省略するとローカル変数と記法が被る」という点は
紛らわしさもあるものの、Rubyのメリットでもあると思ってるので
基本的にためらわず省略するようにしている
>>871 「単純なアクセサではないが名詞的な命名をするメソッド」というのもあるから
一概には言えない。Pathname#realpathとか
matzはレシーバ必ず付けろ派だったと思う。どこかで読んだが忘れた。 それ以来railsのモデルクラス内でカラムにアクセスする時に常にself付ける癖がついた。
>>869 海外のRuby本やRails本を読むと、
・selfは本当に必要なとき以外は付けない(省略できるときは必ず省略する)
・ローカル変数と紛らわしくても気にしない
・returnも書かない。return XXXとは書かずに XXX だけ。
という方針のようだ。
特に2番目は、ローカル変数と同じように見えるからいいのだとでもいいそうな
雰囲気がある。
def current_average
@data / @amount
end
def main
print current_average ← こんなやつね
end
ローカル変数なんて一瞬つかってすぐに捨てるようなもんなんだから、 紛らわしいとかいう時点でウンチを書いてるんだと自覚すべし。
>>867 1.Rubyは値渡し(=引数として渡された変数の値を変えても元の値は変わらない)
2.ただしオブジェクトの参照の*値*が渡される(=オブジェクトの破壊的変更は可能)
1. hoge(hage) と呼ばれたとき hage = fuga としても呼び出し元の hage は壊れない
2. hoge(hage) と呼ばれたとき hage.hige = fuga とすると呼び出し元の hage が壊れる
っていう意味だから*値渡し*で問題ないんだけど
誤解されやすい表現だよね
>>867 >実際Cのポインタの値渡しを参照渡しと説明してる本は
>名著とされる本の中にも結構あるからね
C++ で参照が導入される前に書かれた C の本ではそう書いてあっても全くおかしくない
おまいらそういう話題はruby-listでやれよ… おっと、リアルじゃ恥ずかしくてうかつに口だせないかw
おまえ誰だ?
Perlだと局所的に使いたい変数があるときは { }(中括弧)を使いますが、 Rubyではどうするのでしょうか? my $x = 1; { my $x = 2; } print $x # => 1
同じ変数名を使おうとしている命名規則もしくは設計を見直す
>>881 Proc作ってcallするという方法はある……けど、誰かが使ってるのは見たことない
たぶん、局所的に使いたい変数があるときには
メソッドに分割するだけで十分だからじゃないかな
要するに、できない
>>882-884 Rubyでは、命名規則やメソッド分割で対処するんですね。
了解しました。
886 :
869 :2011/02/06(日) 13:10:16
返事が遅れてすいません。 皆様ありがとうございました。勉強になりました。 省略できるselfは極力省略する、というスタイルで行くことにします。 アクセサとローカル変数の紛らわしさはやはり残りそうですが。。これも慣れるのかな
変な文化だよな。常にself付けておけば間違いも無くなるのに。
>>887 書きやすさ・読みやすさと、間違いの少なさのトレードオフだよ
Ruby初心者が読みやすいコードと、Ruby熟練者が読みやすいコードは、こらまた違うんだよな。
890 :
デフォルトの名無しさん :2011/02/06(日) 18:01:00
WindowsでRuby1.8.7を使ってます。 ネット上にeruby.soが落ちてないので、からソースからコンパイルして使おうとしているのですが、 require "eruby" compiler = ERuby::Compiler.new で、(ちなみにこれは、modrubyに組み込まれている、eruby-runから抽出した箇所です。) .../ruby187/lib/ruby/1.8/i386-mswin32_100/eruby.so: 127: The specified procedure could not be found. - Init_eruby (LoadError) といったエラーが出ます。 どういう原因が考えられるでしょうか。 或いは、mswin32版のeruby.soを持っていらっしゃる方UPして頂けると幸いです。
>>887 >>869 と同じ罠に何度もハマってからPythonのself明示する考え方もありだなと思えてきた。
意図しない動作をするということならテストを書けばいい話だし、
ちょっとしたスクリプトならそれこそselfの明示は面倒だし
Rubyの方針もありだと思うけど
893 :
デフォルトの名無しさん :2011/02/06(日) 18:27:00
LINK : fatal error LNK1104: ファイル 'C:\Windows\Microsoft.NET\Framework\v4.0.30
319;C:\Windows\Microsoft.NET\Framework\v3.5;C:\Program.obj' を開くことができませ
ん。
ってなコンパイルエラーがでたので、該当箇所っぽいところを
--- DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)
+++ DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll
--- EXT_DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)
+++ EXT_DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll
としたのがだめだったのでしょうか。。。
>>892 せっかくCのeRuby実装があるのでパフォーマンスのためにも、使ってみたいのです
894 :
デフォルトの名無しさん :2011/02/06(日) 18:40:13
LIBPATH = "C:/Program Files/Microsoft Visual Studio 10.0/VC/LIB/" or LIBPATH = "C:\Program Files\Microsoft Visual Studio 10.0\VC\LIB\" or LIBPATH = "C:\Program Files\Microsoft Visual Studio 10.0\VC\LIB" DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH) LDSHARED = cl -nologo -LD EXT_DLDFLAGS = -link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH) などと直しても、 LINK : fatal error LNK1181: 入力ファイル 'C:/Program Files/Microsoft Visual Stud io 10.0/VC/LIB.obj' を開けません。 となります。
スレ違い
>>890 devkitでコンパイルしたほうが早そう
>>893 cで実装されたerubyは遅いのでお勧めしない。まだerbのほうがまし。
898 :
デフォルトの名無しさん :2011/02/07(月) 01:28:29
>>897 ありがとう。
しかし
ERBでもerubyでもロードの度にCPUが100%になる。。。
>>898 確か特定のバージョンのRubyは糞だったはず
900 :
デフォルトの名無しさん :2011/02/07(月) 02:55:51
>>893 すでに書かれてるけど、erubyはCで書かれているのに遅いし、print文を使っていて柔軟性に欠けるので、やめたほうがいい。
>>897 erbはファイルをrubyコードに変換する部分が遅いので、erubisのload_fileを使ったほうがいい。
eruby = Erubis::Eruby.load_file('example.rhtml')
print eruby.run(binding)
配列の第1要素を降順に安定ソートするにはどうすればいいのでしょうか? fruits = [['banana', 3], ['cherry', 2], ['banana', 1], ['apple', 4], ['banana', 5]] fruits.sort{|a, b| ??? } 欲しい結果 [["cherry", 2], ["banana", 3], ["banana", 1], ["banana", 5], ["apple", 4]]
fruits.sort{|a, b| b[0] <=> a[0] }
905 :
デフォルトの名無しさん :2011/02/07(月) 17:10:30
>>904 では安定という要求を満たせないので
fruits.each.with_index.sort {|a,b|
(b[0][0] <=> a[0][0]).nonzero? || a[1] <=> b[1]
}.map(&:first)
とか。
もっとスマートに出来そうだけど。
Rubyのsortって安定じゃなかったんだ・・・ 単なる数値じゃなくオブジェクトの配列をソートすることが多いRubyなのに
907 :
デフォルトの名無しさん :2011/02/07(月) 17:32:38
>>905 ありがとうございます。
期待通りの動作が得られました。
fruits.each.with_index.sort_by{|v,i| [v[0],-i]}.reverse.map{|v,i| v} こんなんとか?まだ分かり辛い気もする
sort_by だと降順が入るとめんどくさくなるんだね。
Ruby使ってる人って安易に配列とかハッシュ使っちゃうよね。 そいでマップしてソートしてリバースしてマップして(ry みたいな気が狂ったようなコードを書いちゃう。
次はもうちょっと気の利いた煽りを頼む
fruits.reverse_sort_by_with_index {|v, i| [v, i]}
>>912 Rubyではお手軽に書けるけど、他のLLだと「やりたくても、できない」からね
いわゆる「酸っぱい葡萄」かな?
>>905 がなにやってるのかまったくわからないのでだれかかいせつたのむ
>>916 メソッドと記号の意味を追えば分かる
俺でも分かったんだから大丈夫
>>905 を解読してみた。
# フルーツと添字をペアにして、配列arrに格納
arr = []
fruits.each_with_index {|x, i| arr << [x, i] }
# 比較方法を指定してソート
arr.sort! {|pair1, pair2|
# フルーツの名前で比較
val = pair2.first[0] <=> pair1.first[0]
# それが同じだった場合にのみ、添字で比較
val != 0 ? val : pair1.last <=> pair2.last
}
# フルーツだけを取り出す
p arr.collect {|pair| pair.first }
ここで、
arr = []
fruits.each_with_index {|x, i| arr << [x, i] }
が、905では
fruits.each.with_index
となっていて(これは1.9での書き方かな?)、
val = pair2.first[0] <=> pair1.first[0]
val != 0 ? val : pair1.last <=> pair2.last
が905では
(pair2.first[0] <=> pair1.first[0]).nonzero? || pair1.last <=> pair2.last
となっているわけだね。なるほど。nonzero?なんて初めて知った。
ttp://www.ruby-lang.org/ja/man/html/Numeric.html#nonzero.3f
while true fruits.shuffle! if fruits[0] >= fruits[1] if fruits[1] >= fruits[2] if fruits[2] >= fruits[3] if fruits[3] >= fruits[4] if fruits[4] >= fruits[5] break end end end end end end
920 :
デフォルトの名無しさん :2011/02/08(火) 00:38:04
ぼごそーとはいろいろマテ array.shuffle! until array.each_cons(2).all? {|a,b| a < b } # 1行ver.
i=0 fruits.sort_by{|v| [v[0].bytes.map(&:-@),i+=1]}
サルにプログラム書かせるのやめろ
さ、ドヤ顔で卒業論文で無限猿をやってのけた俺に謝ってもらおうか。
>>905 fruits.sort_by.with_index{|v,i| [v[0], i]}
Enumerator#with_indexの真骨頂
素で、勘違いしてた、非常にはずかしい なかったことに fruits.sort_by.with_index{|v,i| [v[0], -i]}.reverse
反射的にレスすることで安定は失われた・・・!
reversetって安定じゃないの?
あ、そっか。
>>928 みたいに、インデックスをマイナスにすれば、最初のreverseがいらないね。
俺も脊髄反射だw
i=0
fruits.sort_by {|v| [v[0], -(i += 1)] }.reverse
というかデクリメントすればいいだけか。。 連投すまそ。 i=0 fruits.sort_by {|v| [v[0], i -= 1] }.reverse
ただのsortは安定じゃないけど、sort_byは安定ってこと?
936 :
デフォルトの名無しさん :2011/02/08(火) 09:45:54
>>924 これで思い出したけど円周率3.14...のなかにはどんな数字の組み合わせも入ってる可能性があるらしいね
例えば、人の名前を数字に当てはめてそこに生年月日とか生まれた時間とかくっつけたのを絶対見つけることができるらしい
それなら未来のこともどうにか数字にしてわかるんじゃね?って研究してる人の話を聞いたことがある
「可能性があるらしい」から 「絶対見つけることが出来る」という結論は出ないと思う 円周率に0が100個続く列があるか、ってのは証明が難しいんじゃなかったか
引数で安定/不安定が選べるといいね。 sort(:stable => true){|a| a<=>b } sort(:method => :merge){|a| a<=>b }
939 :
デフォルトの名無しさん :2011/02/08(火) 10:07:16
>>937 ごめんスレ違いなんだけど
その研究者が講演とかをやってそれを実演してるらしい
そこに用意してある円周率はたった数千〜万桁?ほどなんだけど
希望者の名前と生年月日の組み合わせは100%あるとのこと
インデックスつきの無限ループというのは、Rubyでは通常どのようにするのでしょうか? limit = 5 loop do |i| break if i > limit end
>>940 limit = 5
i = -1
while true
i += 1
break if i >= limit
do_something
end
まあこれなら
i = -1
while (i += 1) < limit
do_something
end
だな
>>939 名前をどういうふうに数字にしてるのかしらないけど、
単純に確率の問題。
0が100個だと、10の100乗ぶんの1の確率だから、10の100乗桁あれば、
あってもおかしくない。そんだけ。
>>935 リファレンスマニュアルにも書いてるけど、安定じゃないよ。
sort_by 使ってる例は i が肝。
>>940 それ無限に見えないけど、こんな感じ?
5.times do |i|
end
loopはなぜ引数付きブロックを取れないのかと 何回か話題になってた記憶がある
loop_with_indexとかあっても良いような
>>946-947 そのときの結論はどうだったの?
ググったらこんな方法があったけど。
enum_for(:loop).with_index do |_, i|
break if i > limit
end
こんなんとかどうだろうか?
0.upto(Float::INFINITY) do |i|
break if i > limit
end
元と同じような使い方で、かつそれによってソースが読みやすくなるなら 元のloop置き換えちゃっていいじゃね理論 def loop return unless block_given? i = -1 yield i += 1 while true end loop{|i| break unless i < 10 puts i } loop{ puts "#"; sleep(0.1); }
loopにはStopIteration例外を補足してループ終了するという機能がついてます Enumeratorを外部イテレーターとしてまわすときにloopと組で使うわけです counter = 5.times loop do p counter.next end while true p counter.next #whileだと例外でエラー終了 end
なにそれかっこいい
loopを置き換えるならオリジナルloopを呼ぶか 自分でStopIteration例外を補足する必要があります カウンター付きloopの提案 引数つけたときだけカウンター回せばいいんじゃないだろうか これなら既存の使い方のパフォーマンスも落ちないはず ついでにEnumeratorも生成できれば便利なのでは 引数は succできるやつとEnumeratorのみ受け付けれられればいいかな でも、名前がだめだめなのでまったく採用の見込みは無さそう loopにはカウンターをまわすイメージが無いので
alias :orig_loop :loop def loop(counter = nil) raise TypeError unless counter.nil? or counter.respond_to?(:succ) or Enumerator === counter return enum_for(:loop,counter) unless block_given? case when counter.nil? orig_loop{ yield } when Enumerator === counter orig_loop{ yield counter.next } when counter.respond_to?(:succ) orig_loop{ yield counter; counter = counter.succ } end end limit = 5 i = 0 loop(1){|n| p n; break if (i+=1) >= limit} i = 0 loop('a'){|n| p n; break if (i+=1) >= limit} i = 0 loop((1..3).each.cycle){|n| p n; break if (i+=1) >= limit} endless_counter = loop(0)
というより最近のrubyだと loop.with_index{|_,i| p i } とかできるんだなw初めて知った
うおー、そんなのできるんだ、と嬉々としてコード書き直してみたら、 サーバ(CentOS5)のRubyが1.8.5だったときの絶望感ったらないね。
>>954 おおー、ブロックなしだと、Enumeratorを返すようになったんだ。
あまりうれしくない気がする [nil].cycle と同じだし p loop.take(5) #=> [nil, nil, nil, nil, nil] p [nil].cycle.take(5) #=> [nil, nil, nil, nil, nil] 無限nil列って使い道あるのか? with_indexしたところで、余分なnilが付いてくるし
実用面での欠落そっちのけでオナニー記述ばっかり充実していくなRubyは
言語オタク用言語ですから(キリッ
dupできるかどうか判別する方法はないでしょうか? 初期値を比較的安全に設定するために、指定された初期値を dupして代入しようとしましたが、 初期値が数値などの場合 dup で例外が発生します。 respond_to? でdupできるかどうか判別できるかとも思いましたが、dup できなくても true が返ってきます。 今は仕方がないので例外を捕捉して例外時はそのまま代入していますが
>>963 ねとらじの運営にゴルァするのがベストかと
well-formedなXMLを送ってこいと
そのライブラリは使ったことないけど、もしそれが本当なら xmlの必須要素である<>があるとエラーなんて、ライブラリとしてあってはならないバグだ 即刻バグ報告すべき
>>964-965 すみません勘違いでした
ちなみ
>>963 でかってに変換されてるんですけど>は&gt;、<は&lt;になっていて問題無いみたいです
実際は唐竍鰍ンたいな機種依存文字が入ってるいるとエラーになっています
>>962 ・ dup も clone も浅いコピーであることについてここに判子押した上で実際に dup して rescue する
・ コストが高いことを理解した上で Marshal.load(Marshal.dump(arg)) する
・ 引数を複製しないと安心できないというのは70パーセントくらいの割合でデザインミスなので考え直す
お好きなものを張り切ってどうぞ
REXMLは内部でiconvをバカ使いしてるので、日本で使われてるShift_JIS名義のXMLが苦手だったはず
headline_url = "
http://yp.ladio.livedoor.jp/stats/list.xml "
xml = open(headline_url).read
xml = xml.sub!(/encoding="shift-jis"/){'encoding="CP932"'}
aa = REXML::Document.new(xml).root
でどうだ
ご飯食べてないので変な書き方になった
headline_url = "
http://yp.ladio.livedoor.jp/stats/list.xml "
xml = open(headline_url).read
xml.sub!(/encoding="shift-jis"/){'encoding="CP932"'}
aa = REXML::Document.new(xml).root
もし使ってる iconv が Windows-31J を解釈できる非公式 iconv なのなら
指定するのは CP932 ではなく Windows-31J のほうがいい
もし、CP932 を指定しても Iconv::IllegalSequence の例外が出てしまう場合は…
まあ元の XML のエンコーディング指定が間違ってるのがそもそもいけないんですけどね encoding="shift-jis" って宣言したなら Shift_JIS 以外の文字は入れないで頂きたい @ABとか鰍ニかとかご法度 本当は REXML::Document.new(xml, :encoding=>'CP932') とか指定できるのが望ましいんだけど そういう構造にはなってないなさすが原産地外国 ちなみに Nokogiri だと Nokogiri::XML.parse(xml, nil, 'CP932') で動作する
>>970 ありがとうございます解決しました
機種依存文字は意識したこと無かったので勉強になりました
>>968 すいません気をつけます
>>969 反応ありがとうございます。
3番目の設計見直しでいきます。
1番目は今のやり方です。浅いコピーだということは承知しておりまして、比較的安全にと書いたのはそういう意味です。言葉足らずでしたね
2番目、今回例外処理のコスト高を何とかしたいというのが動機でしたので。
active_supportではduplicable?を定義してますね。姑息な手段に思えます。ruby本体でサポートして欲しいなあ
>>963 昨日見たときは "\x13" だかの変な制御コードがあって引っかかってたけど、今日見たら無くなってた
そろそろ初心者を卒業できたかなと思ってこのスレを開いてみたのに スレ内容が全く理解できないという。
977 :
デフォルトの名無しさん :2011/02/10(木) 00:27:44
nilチェックについて質問です。あるインスタンスの真偽値を取得する際に if hoge && hoge.isXXX? こんな操作を毎回やっているのですが、rubyらしい手法はありますか? 設計が悪いとかnullObject使えとかそういう感じなんでしょうか
>>977 if param.is_foo? といきなり書くと param が nil だった場合 NoMethodError になってしまう
かと言って if param && param.is_foo? と書くのは正しいのだが冗長に見えて仕方がない
なんとかする方法はありませんか?
というような質問はしょっちゅう出るのだが、汎用な回答はない
if param && param.is_foo? と書くようにするのがいちばん無難
あとは NoMethodError が出ることを駄目データが出たメッセージとして許容するとか
nullチェックとかめんどくさいだけだからしなくていい。 nullを返す場合があるメソッドを読んだ時にだけチェックすればいいのだ。
982 :
977 :2011/02/10(木) 02:36:28
>>980-981 なるほど、まあ無難と言われてちょっと安心です。
methodや機能それぞれについてアサーション(一般的な意味を含む)
をしっかり考えてそれを前提にすれば、nullチェックなどいちいち書かなくてもいい
という意見にも納得です。
983 :
デフォルトの名無しさん :2011/02/10(木) 02:37:02
Rails厨なら Object#try
むしろ「ここはnilを返さないはずだ」という認識を持っている場所ではnilチェックをしてはいけない。 無意味なnilチェックでバグを見逃すことになる。
nullってなんですか(素) nil が起こす NoMethodError はかなり特別だ たいていの Ruby プログラマは、これを「nil かどうかチェックして分岐しとけよ糞が」とは思わない むしろいわゆるシグナルとして残す ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども
>>985 > nil が起こす NoMethodError はかなり特別だ
はあ?
> ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども
はあ?
自称上級者気取りが初心者を混乱させるのはやめてほしいな
はあ?だけじゃ解からんだろ。 息が臭いだけ。
どこが特別なのか全然伝わってこないよってことだろ
ついでに書くと、Rubyでは一般にis_xxx?というメソッド名は付けない たいていis無しのxxx?にする
990 :
977 :2011/02/10(木) 08:39:20
それだとif hoge is xxx thenというふうに読めなくて嫌だったりする。 ?そのものはboolを返すという記号としては有りだと思うけど。
>>985 Java だと、ぬるぽだな。これが一番わかりやすいかな。
C だとSegmentation fault になる。
segmentatino fault だと色々原因がありそうだけど、殆どがぬるぽなんだよな。
誰かが nil を発生させてその結果処理が滞りました、ということを検出できる例外だからな ものによっては rescue で自前の例外を発生させてユーザーにわかりやすく知らせたりもするぬ
12時半に次スレ立てる 35分になっても立ってなかったら失敗なので次の人どうぞ
うめ
うめ
立ってないのに埋めようとすんな
ごめん
立った?
いいえ
新スレ立てムリポ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。