Ruby 初心者スレッド Part 40

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2レシピブックを第3版に:2010/12/11(土) 15:47:23
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/gp/product/4797357401/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
 ・「初めてのRuby」
  http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
 ・「Rubyレシピブック 第3版 303の技」(初心者向け、1.9対応)
  http://www.amazon.co.jp/dp/4797359986/
 ・「プログラミングRuby 第2版 言語編」(初心者向け参考書)
  http://www.amazon.co.jp/dp/4274066428/
 ・「Ruby Way 第2版」(脱初心者向け)
  http://www.amazon.co.jp/dp/4798115339/
 ・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
  http://www.amazon.co.jp/dp/4873113245/

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  http://www.amazon.co.jp/dp/4873113946/
3非更新:2010/12/11(土) 15:48:12
Ruby 公式・非公式便利サイト2009

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
 http://www.ruby-lang.org/ja/man/
 http://www.ruby-doc.org/ 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
 http://elbereth-hp.hp.infoseek.co.jp/ruby.html
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/
4最新スレに更新:2010/12/11(土) 15:49:12
●関連スレ
【RoR】Rubyについて Part 41【CPAN vs RubyGems】
http://hibari.2ch.net/test/read.cgi/tech/1281473294/
●Railsスレ
【RoR】Ruby on Rails Part11
http://hibari.2ch.net/test/read.cgi/php/1292032736/
●アンチスレ
Rubyについて(アンチ専用) Part004
http://pc12.2ch.net/test/read.cgi/tech/1249737531/
●Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

●前スレ
Ruby 初心者スレッド Part 39
http://hibari.2ch.net/test/read.cgi/tech/1287623173/
Ruby 初心者スレッド Part 38
http://hibari.2ch.net/test/read.cgi/tech/1282781922/
Ruby 初心者スレッド Part 37
http://hibari.2ch.net/test/read.cgi/tech/1274121477/
5デフォルトの名無しさん:2010/12/11(土) 15:50:30
ポニーテール 乙
6まとめて短く、ASRのURL更新:2010/12/11(土) 15:51:15
【バージョンに関するよくある流れ】

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/
このトラブルを回避できるようになったら初級者脱出かも
7デフォルトの名無しさん:2010/12/11(土) 15:52:23
てんぷれおわり
8デフォルトの名無しさん:2010/12/11(土) 18:54:45
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
9デフォルトの名無しさん:2010/12/11(土) 20:45:54
Chris pine氏のサイトを一通り読んでプログラムを書いた程度のものです。
rubyはweb開発に使われていると聞きます。
出力や入力、関数などについては分かったのですが
どうやったらrubyとweb開発を繋げることができるのか分かりません。
rubyとweb開発を繋げて考えるには何をするべきなのですか?
10デフォルトの名無しさん:2010/12/11(土) 20:46:34
Webサーバーからつくれます
11デフォルトの名無しさん:2010/12/11(土) 20:55:14
9じゃないけどWebで使えるのってJavaScriptだよね。
どうやってあそこにRubyで書くの?
12デフォルトの名無しさん:2010/12/11(土) 20:56:58
書けません
13デフォルトの名無しさん:2010/12/11(土) 20:58:14
>>9
まずは「ruby web開発」でググるところから始めてみては?
いや煽りじゃなく真面目に
14デフォルトの名無しさん:2010/12/11(土) 21:01:35
>>11
JavaScriptはクライアントで動くものです。
RubyでWebアプリケーション開発、という場合にRubyを使うのはサーバ側です。
15デフォルトの名無しさん:2010/12/11(土) 21:01:44
Ruby ビギナーのための CGI 入門 【第 1 回】 初めての CGI プログラム
http://jp.rubyist.net/magazine/?0011-CGIProgrammingForRubyBeginners
16デフォルトの名無しさん:2010/12/11(土) 21:08:03
RubyのWebアプリでこんな事をしたいんです
ttp://www.nicovideo.jp/watch/sm5630363
17デフォルトの名無しさん:2010/12/11(土) 21:16:19
それはWebアプリというよりもRIAだから。
そういうことやるための環境が整備されてない言語では無理。
Java FXかAdobe FlexかMicrosoft Silverlight(かMono Moonlight)でやんなさい。
18デフォルトの名無しさん:2010/12/11(土) 21:16:53
>>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
1918:2010/12/11(土) 21:18:08
アイちゃんにレスしてた…漏れはもうだめだ
20デフォルトの名無しさん:2010/12/12(日) 00:09:38
ちょいと質問

gem入れるときにコンパイル必要なものがこける
linuxだとそういうのを入れるためのコンパイル環境は簡単に入れられる。
(ubuntuならapt-get install buildeessentialとかそういうの)

Windowsだと、mingw32版ならdevkitいれればいいよね?
mswin32版の場合どうすんの?

コンパイル済みのものが別途用意されてる場合もあるけど、
なら最初からgemにプラットフォーム指定していれとけやっていつも思うんだけど
21デフォルトの名無しさん:2010/12/12(日) 00:12:30
apt-get install build-essential だった
22デフォルトの名無しさん:2010/12/12(日) 00:20:32
>>16
それってWebアプリなのか・・・

Adobe AIRみたいなものだよな?
JavaFX相当のことはJRubyじゃできないんだっけ?

どうしてもRubyでやりたいというのは「Rubyに慣れてきて何でもRubyでやりたい」という意味以外ない気がするんだが、
AIRのようなRIAなフレームワークならTitanium Desktopというのがある
まだ使われているのは殆ど見ないが

23デフォルトの名無しさん:2010/12/12(日) 00:24:14
gem パッケージの提供者が現在使用している Ruby に対応したバイナリを提供していない場合、
自分のマシンのコンパイラが走るようになってる

gem パッケージ作者がバイナリパッケージを提供していなくて、
自分の使用している Ruby が mswin で、
自分のマシンに VC 6 がインストールされてない場合、その gem パッケージは使用できないだろうね

それでもどーしても使いたい場合は
コンパイル環境を用意した上で、それでコンパイルされた Ruby をインストールしてないと駄目
実質的に mingw ruby + devkit (または mingw コンパイラ一式別途導入)しか選択肢がないけど…

コンパイラがインストールされてない安全に倒した Linux サーバとかでも同じ問題が実は起こる
そういう場合、Linux のソフトウェアパッケージで gem パッケージ相当が用意されてたりもする
24デフォルトの名無しさん:2010/12/12(日) 00:36:58
>>23
うむ、すごいそれっぽい
25デフォルトの名無しさん:2010/12/12(日) 00:59:39
バイナリ互換性はある
migw32 向けに適切にコンパイルされた拡張バイナリは、mswin32 でも使用できる…ということになっている
VC6 がないなら MinGW というか GCC でコンパイルしてしまえばいい

rubygem は作者が登録しているバイナリパッケージしか探さないので
作者がmswin32名義のバイナリパッケージ(中身はmingw32製)を用意し忘れてた場合
gem install hogehoge という書き方ではインストールできないことがある

mswin32 名義のバイナリパッケージ入れてーとgem作者にメールでもするのが一番早い
2620: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
      なんでも自分でできる人向けの選択、外野がどうこう言うことではないのでおまえらも文句言うな的な似非上級者向け
2720:2010/12/12(日) 01:15:38
>>23
さすがにVC6はww

Ubuntuでもインストール直後はコンパイルできませんね

>>25
バイナリ互換性はあるんですね

mswin32名義でも中身はmingw32なんですかw
28デフォルトの名無しさん:2010/12/12(日) 11:17:35
hoge-1.2.3-x86-mingw32.gem みたいなファイルを直接拾ってきて gem install すると mswin32 でも入るはず
gem install --source なんとか でなんとかの部分に mingw32 のを書いても代わりに持ってきてくれるはず
29デフォルトの名無しさん:2010/12/12(日) 15:11:17
http://rails2u.com/projects/refe.vim/ が落ちているのか、もう配布していないのか??
30デフォルトの名無しさん:2010/12/12(日) 15:28:25
変数名を取得する方法はありますか?
x=232
def f(func)
...
end
p f(x)
=> "x"
31デフォルトの名無しさん:2010/12/12(日) 15:54:34
何がしたいんだかよくわからないけど。
その f って、たとえば f(1) のように呼び出したら何を返すの?
32デフォルトの名無しさん:2010/12/12(日) 15:57:25
funcって書いたのがまぎらわしいですね。

foo=232
def f(bar)
...
end
p f(foo)
=> "foo"

f(1)は未定義ということで。
33デフォルトの名無しさん:2010/12/12(日) 16:00:25
puts (1..4).to_s って、"1..4"と出力されるけど、これって意味あるの?
"1234"と返ってきたほうがまだ使い道ありそうだけど、どういう使い方が想定されてます?
34デフォルトの名無しさん:2010/12/12(日) 16:02:08
てか、たしかに関数として書くとわけわかんないですね。
barには232が渡されるだけだから変数名なんて知らないか・・・。

単に
foo=232
という定義済みの変数があったとき、
後で
"foo"
という文字列を取り出したいだけなんですが・・・。
35デフォルトの名無しさん:2010/12/12(日) 16:07:51
local_variables や global_variables などいかがでしょう
36デフォルトの名無しさん:2010/12/12(日) 16:20:11
>>35
それいただきました。
しかしわりと面倒ですね・・・。
37デフォルトの名無しさん:2010/12/12(日) 16:24:00
>>33
1..4がRangeだし、俺はto_sで1..4でいいんじゃね?って思うし開発者の意図と一致したけど
何で"1234"がいいと思った?

"1234"が得たいだけなら [*1..4].to_s ででるけど、結果的だしな


38デフォルトの名無しさん:2010/12/12(日) 16:36:50
>>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]"
(´・ω・`)
4033: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は両端
しか保持してないんだし、両端だけが文字列に表れるのは妥当だと思うよ。
42デフォルトの名無しさん:2010/12/12(日) 18:24:17
>>40
eval したら to_s のレシーバが復元できるからじゃまいか
Ruby の場合他のクラスもそうなのかは知らない
43デフォルトの名無しさん:2010/12/12(日) 19:05:05
>>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] って勝手に省略されてたらムキーだろ
「中身」が欲しい場合はユーザーが手作業で行う
44デフォルトの名無しさん:2010/12/12(日) 19:07:55
どや顔でそんなこと言われても困るYO
45デフォルトの名無しさん:2010/12/13(月) 06:08:53
ライブラリのファイル名やGemパッケージ名に関しての標準的なルールを教えてください。
Railsを参考に仕様としましたが、activerecordだったりactive_recordだったりしてよくわかりませんでした。
46デフォルトの名無しさん:2010/12/13(月) 07:52:58
>>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
に書いてあったり書いてなかったりする
47デフォルトの名無しさん:2010/12/13(月) 11:31:53
自作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)かなと思うのですがどうでしょうか。
48デフォルトの名無しさん:2010/12/13(月) 11:40:22
16個の配列でMatrixへの代入ならcolomnsかrowsだろ

と思ったがそういう話ではなかった
マス目という意味でのマトリックスなのね

newになにもないならnewの引数にするのが普通だと思う
4947:2010/12/13(月) 11:42:33
>>48
後から値を変える場合はどう書くのがスタンダードですか?
50デフォルトの名無しさん:2010/12/13(月) 11:52:42
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の正方行列の意味?
5247:2010/12/13(月) 12:37:23
いや一般的に代入は「何とか」=ですよね?
MyMatrixのように「何とか」が自明でないときは、どうすればいいかという話です。
例えで出しただけなのでrowとかcolumnとか言われても困る。
53デフォルトの名無しさん:2010/12/13(月) 12:57:26
MyMatrix という名称と配列代入という行為である程度データ構造が自明だと思える人々 >>48 >>50 >>51
MyMatrix という名称や配列代入という行為は一般的過ぎて何も想起されないと思っている人 >>47

という差のような気もする
54デフォルトの名無しさん:2010/12/13(月) 13:00:15
普通は内部でデータを保持するインスタンス変数と同名のメソッドを使うべきだと思うんだが
たぶんインスタンス変数名をどうすればいいですかという質問になりそうな気もするな

既存のデータ系のクラスと同じような動作にしておいて、同じ名前のメソッド使うというのはどう
55デフォルトの名無しさん:2010/12/13(月) 13:04:22
たぶん配列代入もただの例で、配列には意味がないとか言い出すに一票
5647:2010/12/13(月) 15:25:47
もういいです。聞くだけ無駄。
ありがとうございました。
57デフォルトの名無しさん:2010/12/13(月) 17:11:08
要領をえない質問、情報後出しで右往左往、
捨て台詞吐いて逃亡か。最悪だな。
58デフォルトの名無しさん:2010/12/13(月) 18:31:01
釣られたみなさんご愁傷様
59デフォルトの名無しさん:2010/12/13(月) 21:14:33
>>46
ActiveRecordのgem名は「activerecord」だから、ちがうんじゃない?
それからそのサイトの説明だと
> If you're adding functionality to another gem use a dash.
とあるから、既存のgemに機能をつけたす場合にダッシュ(ハイフン)を使えとあるから、そう説明しようよ。
60デフォルトの名無しさん:2010/12/13(月) 21:43:53
Rubyで統計を扱うライブラリの定番は何ですか?
61デフォルトの名無しさん:2010/12/13(月) 21:47:54
>>60
とくにないです
自分の使い慣れた統計システムのRubyバインディングとか探してください
62デフォルトの名無しさん:2010/12/13(月) 22:24:59
>>61
なるほど、バインディングですか
これから始めるため使い慣れた統計システムは特に無いので
R使ってやってみます。ありがとう
63デフォルトの名無しさん:2010/12/14(火) 00:26:20
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++くらいじゃね?
65デフォルトの名無しさん:2010/12/14(火) 01:03:24
d = Derived.new
Base.instance_method(:hello).bind(d)[]
とか?
6663:2010/12/14(火) 01:31:01
簡単な方法はないか…C++ならこれで一発なのに
d->Base:: hello ();
d->Derived:: hello ();
どうするか考えます。

67デフォルトの名無しさん:2010/12/14(火) 10:46:01
FooクラスにFoo#to_sを定義しても
puts "Foo = " + foo
が、 TypeError: can't convert Foo into String になるのはなぜ。
Stringに変換するために必要なメソッドは?
68デフォルトの名無しさん:2010/12/14(火) 10:54:36
>>67
to_sを明示的に呼ぶ
Rubyは原則として暗黙の型変換のような振る舞いはしない

puts "Foo = " + foo.to_s
69デフォルトの名無しさん:2010/12/14(火) 10:59:45
>>67
puts "Foo = " + foo

"Foo = " + foo
したものの返り値を puts メソッドに渡してる
"Foo = " + foo
の時点でエラーになるはず

一応、 String#+(other) は other#to_str を呼んでいるので
Foo#to_str を Foo#to_s のエイリアスにでもしておけばいいんだが、
より現実的には>>68だと思う
70デフォルトの名無しさん:2010/12/14(火) 11:04:25
ちなみに "#{うめこみ}" の形式を使用すると 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!
7167:2010/12/14(火) 11:17:32
>>68-70
理解しました。to_sとto_strの2つのメソッドを定義しないといけなかったのですね。
似たような名前の関数を2つ提供するのは微妙だからto_sだけにしておきます。
72デフォルトの名無しさん:2010/12/14(火) 11:42:35
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 が出来てるんだな。
74デフォルトの名無しさん:2010/12/14(火) 13:02:57
>>73
あのへんはいろいろ揉めたらしいね
to_str 自体が「既存の標準ライブラリに迎合する動作」としての使われ方をしてたから
75デフォルトの名無しさん:2010/12/14(火) 15:37:02
質問です。
Ajax アプリケーションを作成中で、サーバーサイドで Ruby 1.8.7 を使用しています。
クライアントサイドから Get で 〜〜.rb に引数つきでアクセスしようとしています。
(たとえば「〜〜.rb?No=〜&Name=〜」のようなかんじで)

しかし、Ruby 側でその引数(No=〜&Name=〜)を取得する方法も、
クライアントサイドに値を返す方法(クライアントで .responseText で取得するやつ)もわかりません。
どうやったらよろしいでしょうか?
馬鹿馬鹿しい質問なのだとは思いますが、教えてください。お願いします。
76デフォルトの名無しさん:2010/12/14(火) 16:15:14
>>75
そもそも現状の Ajax アプリケーションは Web アプリケーションの最終進化形態のひとつだ
(まあ、いろんな意味で)
サーバサイドとクライアントサイドと通信手段の基礎となる知識をすべて吸収した上で応用するという形になる

CGI 作ったことがないなら、たぶん無理だと思う
素直に Ajax 連携に定評のある他の言語使ったほうがいいんじゃないかな
77デフォルトの名無しさん:2010/12/14(火) 16:42:31
Railsスレで聞けば別の回答が返ってくる説に一票
78デフォルトの名無しさん:2010/12/14(火) 16:54:00
>>76
そうですか…そんなにハードルの高いことだったのですね…。
かなり軽く考えていたかも知れません…。
しかし、心からの親切心でそう言っていただいていると思うので
大変恐縮なのですが、私にも事情があり、どうしても諦めるわけにはいかないのです。
ほんとうにありがとうございます。

>>77
そうなんですね。
しかし今から全く未経験の Rails に手を出す余裕は無いのです。
どうもありがとうございます。
79デフォルトの名無しさん:2010/12/14(火) 17:14:35
Rubyでやらないほうが早いって言われてるのに
80デフォルトの名無しさん:2010/12/14(火) 17:34:50
>>79
誤解させてすみません。
どうしても Ruby を使わなければならないのです。
自分もできたら他言語でやりたいっす…。
81デフォルトの名無しさん:2010/12/14(火) 17:42:54
CGIだったら環境変数。Ruby関係ないよ
82デフォルトの名無しさん:2010/12/14(火) 17:44:59
>>80
迷える子羊のために三択を用意した

1. Ruby標準添付のCGIモジュールについて調べる
 でもってローカルにApacheでも立ててクエリ文字列とPOSTの内容と
 環境変数をダンプできるCGIを作って動作するところまで頑張る
 そこまでいければなんとかなる
2. 諦める

さあ選んでくれ
83デフォルトの名無しさん:2010/12/14(火) 18:03:40
第三の選択肢は↓
84デフォルトの名無しさん:2010/12/14(火) 18:10:40
中途半端な知識でAJAXなんて脆弱性垂れ流すに決まってる ちょっと考え直した方がいい
85子羊:2010/12/14(火) 19:01:23
>>82
「1.」の一択でお願いします。早速学習を始めます。
いちおう Apache はローカルにインストールしてますが、Apache に関する知識は皆無です。
環境が Windows でブラウザで
http://コンピュータ名/htdocsフォルダに置いてあるファイル名」という
アドレスにアクセスすることでそのサイトにアクセスできる状態にしています。
それで参考にお聞きしておきたいのですが、
「クエリ文字列とPOSTの内容と〜〜動作するところまで頑張る」という部分は
CGI モジュールについて学習すれば理解・実現できる内容ですか?
それとも Apache に関する書籍なども購入して学習する必要がありますか?

ほんとうにありがとうございます、救われた思いです。
とりあえず CGI モジュールについて学習します。一生懸命頑張ります。
86デフォルトの名無しさん:2010/12/14(火) 19:33:19
Ruby案件可ってことにして受注しちゃったのか?
87デフォルトの名無しさん:2010/12/14(火) 19:53:41
>>86
ていうかプログラミングに対する知識と経験が絶望的に足りないと思われ
「ふつう」の知識と経験があるなら>>75の場所では詰まらないと思うの
Ajax とは、みたいな説明や適当な Ajax の解説やサンプルを読んである程度理解したなら
Ajax として目新しいところとそうでないところの判断くらいはついて欲しい

つまりはこの人「何も作ったことがない」んだと思うよ
運転経験ない人に長距離夜行トラックでの運送なんて任せられるかw
素直に単純な CGI とかの日曜の自家用車ドライブからはじめろw
88デフォルトの名無しさん:2010/12/14(火) 19:55:26
HTMLの勉強をする
CGIの勉強をする(Rubyで)
HTTPの勉強をする
JavaScriptの勉強をする
Ajaxの勉強をする(Rubyで)

こんな順番?
89デフォルトの名無しさん:2010/12/14(火) 20:01:38
HTML の勉強をする
CGI 無関係な Ruby の勉強をする
Apache の基本的な使い方を学ぶ
CGI の勉強をする(Ruby で)
HTTP の勉強をする
JavaScript の勉強をする
Ajax の勉強をする(Ruby で)

こうだろ
…なんかめんどくさいな、どうせ表示するデータの取り扱いでも挫折するんだろうし、最初から Rails にするか
なんか、動作が遅いですとか言われそうな気もするが
でも、Rails が本番サーバで動作するかどうかのチェックも要るな
安価なレンタルサーバだとまともに動かなかったりするし
90デフォルトの名無しさん:2010/12/14(火) 20:45:55
なんか悲しい流れになってきたな。しゃあない面も大きいとは言え…。
91デフォルトの名無しさん:2010/12/14(火) 20:45:57
よその会社に丸投げで発注したほうがいいと思う
92デフォルトの名無しさん:2010/12/14(火) 20:50:42
>>89
HTMLに関しては何がわかってないの?この人
93デフォルトの名無しさん:2010/12/14(火) 20:53:32
そこそこに「わかってる」なら適宜飛ばしていいだろそりゃ
単に要素を列記しただけだと思うぞ

>>90
そもそも「カンタンにWebアプリを作成!」というのが幻想というか妄想なので…
情報商材みたいなもん
94デフォルトの名無しさん:2010/12/14(火) 21:07:51
というか質問は
* クエリ文字列の取得
* XMLHttpRequest#responseTextの取得
これだけなのになんでここまで盛り上がれるのん

後者はRuby関係ないからスルーとして
前者はcgi.params, cgi.query_string, ENV['QUERY_STRING']
その他フレームワークの類似機能を使用する、で終了じゃない
95デフォルトの名無しさん:2010/12/14(火) 21:13:34
悲しげなフレーバーを嗅ぎ取ったから
96デフォルトの名無しさん:2010/12/14(火) 22:10:21
>>75
ほかの人のアドバイスと被る部分もあるが

まずは、Rubyで簡単なCGIスクリプトを作るといい
内容はHelloWorldレベル(簡単なメッセージ表示くらい)で十分だ
作り方は検索したらいくらでも出てくるし、>>94のアドバイスも参考になる

ブラウザ上からそのCGIスクリプトにアクセスして、画面表示ができたら
AjaxでそのCGIスクリプトにアクセスして
CGIの出力を持ってくる(JavaScript側で出力を受け取る)ところまでやる

ここまでできれば、後は応用でなんとかなると思う
97デフォルトの名無しさん:2010/12/14(火) 23:47:25
どう考えても仕事じゃないだろ
あとrails勉強した方が結果的には最短距離かと
98デフォルトの名無しさん:2010/12/15(水) 00:40:41
Rubyやってる人が最短でできるのがrailsってイメージが自分はあったけど、
最近(っても古いか)の騒ぎ立てでRails使わないのにRubyやってんの?ってのが嫌。
99デフォルトの名無しさん:2010/12/15(水) 01:08:38
Railsを使わないRubyのWebアプリってやっぱイマイチなの?
CGI部分もあまり出来が良くないって聞くよね
素直にPHPでやったほうがいいのかな
100デフォルトの名無しさん:2010/12/15(水) 01:11:32
cgi.rb使うぐらいならsinatra使った方がいいよ
と話をややこしくしてみる
101デフォルトの名無しさん:2010/12/15(水) 01:42:53
>>99
Rubyで書けます

これがメリットだと感じないならRubyでWebアプリケーション作るのやめたほうがよい
いやかなりマジで
102デフォルトの名無しさん:2010/12/15(水) 01:44:35
>>75 >>82
にはSinatraに一票入れたいところだが、次に>>75

 レンタルサーバーでSinatraが動きません
 (もしくはめちゃめちゃ遅いです、使い物になりません)

と言ってくるので、cgi.rbでよいと思う。
103102:2010/12/15(水) 01:47:30
>>101
池上「いい提案ですね」
104デフォルトの名無しさん:2010/12/15(水) 02:25:23
前スレでirbで落ちると言っている人いたよね?
rbreadline.rbを使っているRuby使っている人かもしれない。

readlineがライセンスの問題があるためRubyでreadlineを実装しようとしているもののようだけど、
Windowsでは日本語が入力できなかったり、行を編集しようとすると遅かったりどうにかすると落ちたりするなこれは

pikでRuby 1.9を入れるとrbreadlineが標準添付されたRubyが入るのだが、これだと実質irbが使えないな

105デフォルトの名無しさん:2010/12/15(水) 03:00:26
ActiveScriptRubyのバージョンを1.8.7から1.9.2に上げたら、
irb上で上下カーソルの入力履歴がでなくなりました。
これないとめっちゃ不便なんだけど、どしたらよいの?
106デフォルトの名無しさん:2010/12/15(水) 03:09:47
rlwrapを入れる
107デフォルトの名無しさん:2010/12/15(水) 06:17:24
>>106
あなたが神か?
108デフォルトの名無しさん:2010/12/15(水) 08:20:47
>>106
ありがとうございます。
これは大変良さげなのですが、Windows用バイナリは何処に?
cygwin入れてコンパイルするしかないかな。
109デフォルトの名無しさん:2010/12/15(水) 08:23:53
Sinatraってデプロイとか簡単?
110デフォルトの名無しさん:2010/12/15(水) 09:53:19
>>108
ttp://www.cymric.jp/maxima/maxima-winxp.html
のサイトでこっそりと
cygwin-rlwrap-0.30.zip
っていうファイルがあるみたい
111デフォルトの名無しさん:2010/12/15(水) 10:25:33
>>109
デプロイだけならHerokuは簡単
ただし動作環境にクセがある。
動作環境が満たされるなら遊びのちょっとしたものなら無料の範囲で作れるし、
そうでないなら金払えるなら、サーバー管理の手間かからないしいいんじゃね?

Google App Engineもデプロイだけは簡単だけど死ぬ

VPSでの動作ならRails並に簡単、いつもの慣れた環境をつくってデプロイできる。


え?・・・このレスに有益な情報がないって?
112デフォルトの名無しさん:2010/12/15(水) 10:52:13
>>75です。
みなさん、たくさんの親切なアドバイス、ほんとうにありがとうございます。
みなさまからいただいたアドバイスを参考に学習・開発を進めてまいります。

>>87
おおむね、おっしゃるとおりでございます。
Web アプリケーションの作成は今回が初めてでわからないことだらけです。
>>96 も仰ってあったとおりまずは素直に単純なところから始めようと思います。
ご親切にありがとうございます。

>>88 >>89
参考になります。>>93 のおっしゃるとおり、
その中からわかってない部分を適宜拾い集めて学習させていただきます。
ありがとうございます。

>>94
ありがとうございます。
お陰さまで何とかなりそうな気がしてきました。
参考にして調べてみます。

>>96
まず単純なことから試してみます。
基本ですよね、視野が狭くなって忘れていました。
親切なアドバイスが身にしみました、ありがとうございます。
113デフォルトの名無しさん:2010/12/15(水) 12:58:49
さくらVPSとかカゴヤ・クラウド/VPSとは月1000円もしないんだからそっちで
114デフォルトの名無しさん:2010/12/15(水) 14:04:34
WPFでこのように”1行”で書いたコードを
Rubyならどうやって書くの?

<WebBrowser Source="http:..."/>
115デフォルトの名無しさん:2010/12/15(水) 14:11:50
116デフォルトの名無しさん:2010/12/15(水) 14:13:24
重複だからどうなんだ?
回答がないし、スレ落ちてるから質問しているんだが
それがだめな理由でもあるのか?
117デフォルトの名無しさん:2010/12/15(水) 14:20:13
C#は知っててもWPF知ってる人がいないから回答がこないんじゃね
あきらめれ
118デフォルトの名無しさん:2010/12/15(水) 14:23:52
ていうか処理層違ってどうにもならんし話も膨らまんからガチスルーされたのだろ
回路図示して、Rubyで炊飯器のタイマー起動するにはどうすればいいですかみたいな話に近い
119デフォルトの名無しさん:2010/12/15(水) 14:25:14
なかなかうまいことを言う
120デフォルトの名無しさん:2010/12/15(水) 14:26:57
WPFで1行でできることがRUBYだとできないの?
WEBに強いんでしょ?
121デフォルトの名無しさん:2010/12/15(水) 14:48:43
そんなこと言われましてもIEがWPF/XBAPを解釈して実行しているものをどうしろと
122デフォルトの名無しさん:2010/12/15(水) 14:50:11
PHPのほうがよりWEBに強いと思いますのでPHPの人に同じように質問して、
嫌われるといいと思います。
123デフォルトの名無しさん:2010/12/15(水) 14:57:58
WPF + MSBuild + Silverlight vs. Chrome OS + Native Client + Go

世田谷区民会館ぐらいなら埋まりそうなカードだな
124デフォルトの名無しさん:2010/12/15(水) 15:19:59
>>120
勝手にWEBに強いことにしないで欲しいな。
125デフォルトの名無しさん:2010/12/15(水) 15:26:28
じゃあもっと簡単なところで

<Button/>

たったこの1行でボタンが配置できますが
Rubyだとどうするんですか?
126デフォルトの名無しさん:2010/12/15(水) 15:30:38
>>125
InternetExplorerが公式にRubyをサポートしてからまたおいで
あなたはクライアントとサーバサイドの区別がついていない
127デフォルトの名無しさん:2010/12/15(水) 15:32:22
バカは放置すべき
128デフォルトの名無しさん:2010/12/15(水) 15:33:31
幼稚園児の屁理屈みたいで
見てて微笑ましかったのだが
129デフォルトの名無しさん:2010/12/15(水) 15:33:59
>>125
再現してみるからLinuxで動くコードちょうだい
130デフォルトの名無しさん:2010/12/15(水) 16:04:08
前スレから出没してるアレな人でしょ
どうにかしてRubyを馬鹿にして悦に浸って苦しい日常生活から現実逃避したい低レベルなプログラマさん
kill myselfをお勧めします
131デフォルトの名無しさん:2010/12/15(水) 16:17:37
バカは放置すべき
132デフォルトの名無しさん:2010/12/15(水) 16:22:48
コードで示せないあなたたちがバカではなくて?
133デフォルトの名無しさん:2010/12/15(水) 16:25:36
しかしみんな構っちゃうw
134デフォルトの名無しさん:2010/12/15(水) 16:53:00
Rubyなら
print "<Button/>"
でいいんじゃないの?
135デフォルトの名無しさん:2010/12/15(水) 17:51:21
>>134
>>125はおそらくHTMLじゃないぞ
136デフォルトの名無しさん:2010/12/15(水) 18:03:48
XAMLだね
静的にコンパイルするとb = Button.newみたいなコードが得られる
動的にロードするのならIronRubyでも出きるだろう
137デフォルトの名無しさん:2010/12/15(水) 18:15:33
>>132
kill myself
138デフォルトの名無しさん:2010/12/15(水) 18:24:41
こんな動作をRubyで一行でできる?
Array.ForEach(files,f=>Console.WriteLine(f));
139デフォルトの名無しさん:2010/12/15(水) 18:27:01
できるって言ったらなんなんだろうね
できてないって言って追っ払っちゃおうか
面倒だし
140デフォルトの名無しさん:2010/12/15(水) 18:28:10
やめろおいそれはRubyの得意分野だ
141デフォルトの名無しさん:2010/12/15(水) 18:29:11
>>138
できません
あなたの勝ちです

では他の人次の質問どうぞ
142デフォルトの名無しさん:2010/12/15(水) 18:55:17
そういや、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>
143デフォルトの名無しさん:2010/12/15(水) 19:04:19
force_encodingはエンコード情報だけを強引に書き換えるメソッドなのだが
144デフォルトの名無しさん:2010/12/15(水) 19:19:14
>>143はたぶんわかってない
145デフォルトの名無しさん:2010/12/15(水) 19:28:54
中身が EUC で、force_encoding 'UTF-8' しただけじゃまずいわな。
146デフォルトの名無しさん:2010/12/15(水) 19:45:19
そもそも前スレでどんな話してたかを知らないと頓珍漢なレスに

> それは 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 ほど信用ならないものもないのでまあ掛け捨て保険程度
147デフォルトの名無しさん:2010/12/15(水) 20:00:13
2次元の範囲ってどう指定してますか。
例えば2次元画像の特定の領域(x,y,width,height)を指定するのに
こう書くのは問題ですか。他にもっといい書き方があれば教えてください。
image.pixels[x,y,width,height] = pixels
148デフォルトの名無しさん:2010/12/15(水) 20:10:43
image.pixels[x1,y1,x2,y2] = pixels

そんな書き方してたら座標変換するとき面倒だろ
149デフォルトの名無しさん:2010/12/15(水) 20:17:16
>>148
あ、いやそれは問題にしてなくて例えば
pixels[x..x+width, y..y+height]
pixels[[x,y], [width,height]]
pixels[x,y][width,height]
みたいな書き方の方が良いのかなという話です。誤解させてすみません
150デフォルトの名無しさん:2010/12/15(水) 20:19:20
何でpixelの中にpixelsを格納するのか意味不明
colorならわかるが
151デフォルトの名無しさん:2010/12/15(水) 20:58:50
image内の矩形領域に別の矩形領域pixelsをコピーしてるんじゃないか?
152デフォルトの名無しさん:2010/12/15(水) 21:57:32
>>146
うん、Content-Type ヘッダの charset を ASCII-8BIT の代わりにセットする代わりに
引数指定の文字エンコーディング名をセットするようにできます、という話だよね
153デフォルトの名無しさん:2010/12/15(水) 23:04:09
>>151
あのコードがそのように解釈できるのか?

どうみても、1pixelに複数pixelを割り当てているようにしか見えないが

CopyRect(Rect srcImage,Rect destImage)

とかにすべきだろ
154デフォルトの名無しさん:2010/12/15(水) 23:17:45
image.pixels[x,y,width,height] = pixels
左辺は範囲じゃん
ary[start,length] = ary2の二次元版
155デフォルトの名無しさん:2010/12/15(水) 23:51:03
ぐぬぬ…
156デフォルトの名無しさん:2010/12/16(木) 00:06:45
でもstart, lengthはともかく4つ使ってstart(x), start(y), length(x), length(y)は一般的かな?
157デフォルトの名無しさん:2010/12/16(木) 00:15:29
一般的だろ
158デフォルトの名無しさん:2010/12/16(木) 01:13:15
気持ち悪い言語だなぁ
159デフォルトの名無しさん:2010/12/16(木) 01:54:13
>>145
この場合はforce_encodingが正しい
160デフォルトの名無しさん:2010/12/16(木) 08:09:45
Encoding が BINARY なものに force_encoding で「名前をつける」ことの何が非難対象なのかがわからないな

Encoding は nil が許されないから、必ず何らかの名前がついている
文字エンコーディングを特定できない、または特定しないという印が ASCII-8BIT こと BINARY
ネット経由のファイル取得でエンコーディングを特定できる情報がないから ASCII-8BIT だったものに
force_encoding を使って人間が知ってる情報で名づけてあげることの何がまずいというのか
161デフォルトの名無しさん:2010/12/16(木) 11:39:38
>>75 です。
時間はかかりましたが、やりたかったことができました。
余計かな、とは思いましたがみなさんのご協力がなければ
間違いなく先に進めていなかったので、ご報告させていただきます。

本当に助かりました。ありがとうございました。
162デフォルトの名無しさん:2010/12/16(木) 11:42:38
3Dゲームを作りたいのですが
どうすればできますか?
163デフォルトの名無しさん:2010/12/16(木) 12:27:00
スルー推奨
164デフォルトの名無しさん:2010/12/16(木) 12:39:54
>>162
そういう話題ならマジレスするぜ。
ウィンドウ作成とキー入力、サウンドはqtrubyを使うのが一番簡単。
あとはOpenGLを使ってごりごり書く。
3Dシューティングゲームならこれで作れる(実際に作った)。
ただしそこからPS2レベルのゲームを作るにはかなり努力しないといけない。
表示だけ考えても、そこからモデルのロードとスキニング、アニメーションを自前で実装する必要がある。
これらを実装するのはそれなりに知識と時間が必要。
なので今ちょうどそれらを全部含んだM3Gという携帯電話で使われている3D描画APIを実装して
Rubyから使えるようにしている作業の真っ最中。
もう動いてるけど、さすがにまったく知識のない人間には勧められる完成度はない。
とりあえずOpenGLを使って簡単なゲームを作ってみるべし。
ちなみにモデルビュアーのスクリーンショット。これが100%Rubyで書かれている。
この画像ではわからないけどちゃんとアニメーションしている。
http://www.gazo.cc/up/21983.png




165デフォルトの名無しさん:2010/12/16(木) 12:47:44
スルー推奨
166デフォルトの名無しさん:2010/12/16(木) 12:48:36
167デフォルトの名無しさん:2010/12/17(金) 09:34:26
>>164
おい、スルーし・・・
ちょw

特定しますた


しかし3Dゲーム作るなら、ゲームエンジンのバインディング作ったほ(ry

168デフォルトの名無しさん:2010/12/17(金) 09:41:30
>>164
のぞかせてもらった。

M3GのAPIの互換実装をつくって、別にRubyのバインディングを作ってるのか。
M3Gって需要あるんかいな
169デフォルトの名無しさん:2010/12/17(金) 10:48:18
3DゲーなのにDirectX使わないの?しょぼ
170デフォルトの名無しさん:2010/12/17(金) 11:04:06
>>169
ではWindowsを移植してください
171デフォルトの名無しさん:2010/12/17(金) 12:14:27
rubysdl + OpenGL のサンプル試してみたけど
PSレベルのものは作れそうだ
172デフォルトの名無しさん:2010/12/17(金) 12:19:04
Rubyのブロックってもしかして、
「公開関数が2つ以上関数を引数にとるなんてことめったにねぇよ」
って発想が根底にある?
173デフォルトの名無しさん:2010/12/17(金) 12:21:19
×公開関数
○高階関数
174デフォルトの名無しさん:2010/12/17(金) 12:33:08
>>172
たしかそんなような話は聞いたことがある
175デフォルトの名無しさん:2010/12/17(金) 12:58:09
>>172-174
MLかどっかのログくれ!!


俺もブロック見たときびっくりした。何で1個なんだよって。
でも意外にif else end (ブロック2つみたいなもの)のようなものを作ることがなくて困らない、
というかそういう作り方になってしまう。

どうしてもやりたければlambdaでいい。
1個の場合は楽。バランスなのかも
176デフォルトの名無しさん:2010/12/17(金) 13:02:28
本人が「失敗だった、高階関数を一つ限定にしたのが自分の限界」
みたいなことを言ってた記事を見たことあるが、
なんでもかんでも未来を見通せるわけじゃない。
高階関数を組み入れただけでもすばらしいよ。
177デフォルトの名無しさん:2010/12/17(金) 13:20:52
関係はこれかなあ
ttp://www.rubyist.net/~matz/20070512.html#p04
> 高階関数を持つ言語(OCaml)のライブラリを精査したところ、
> 2239関数のうち、関数引数を取らないものが87.2%、ひとつだけ取るものが12.1%で、ふたつ以上とるものは0.7%であった。
> ここからわかることは、プログラミング言語は 99.3%を占める高階関数(ブロック)を0または1個とるものに最適化するべきであり、
> めったにない二つ以上ブロックのために、それ以外のものを「ゆがめて」はいけない、ということ。

ttp://itpro.nikkeibp.co.jp/article/COLUMN/20050930/221979/
> もちろん,メソッド呼び出しに1つだけしかブロックを付けられないという制約はあります。
> しかし,実際に複数のブロックが必要になることはほとんどありません。

Ocamlの論文はけっこう引用されてて、
「実利を取って引数1個限定でシンプルにしてたRubyは勘がよい」という評価がいくつかあったはず
178デフォルトの名無しさん:2010/12/17(金) 13:30:39
初心者スレだったな

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| ... }
みたいに複数ブロック実行できるようにしたとしても別にデメリットはないんじゃね、
複数引数自体は自然だし、いざという時用に用意しててもよくね? という話
179デフォルトの名無しさん:2010/12/17(金) 13:59:13
>>178
でたでた、良くある初心者ならこれくらいなら理解できるだろうという上から目線。
そもそも高階関数そのものがわからないのに解説して貰ってもねぇ-
180デフォルトの名無しさん:2010/12/17(金) 14:02:03
高階関数
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
181デフォルトの名無しさん:2010/12/17(金) 14:12:49
高階関数とはなにか
Rubyで高階関数を実現するには
lambda, Procとブロックの関係

>>176の真偽も含めて
今日のRuby初心者スレは盛りだくさんだな
182デフォルトの名無しさん:2010/12/17(金) 14:22:48
時間帯まとめてレスがつくのが興味深い
まるで一人で書いているかのようだ
183デフォルトの名無しさん:2010/12/17(金) 15:50:31
class Foo
def bar(obj=nil)
obj.foo
end
private
def foo
puts "foo"
end
end
Foo.new.bar(Foo.new)
184デフォルトの名無しさん:2010/12/17(金) 15:52:01
多分ここ見ているの3人ぐらいJane?
185デフォルトの名無しさん:2010/12/17(金) 16:40:55
>>182
均等にばらつくほうが不自然
186デフォルトの名無しさん:2010/12/17(金) 18:04:03
>>183
Goldの問題だな
187デフォルトの名無しさん:2010/12/17(金) 18:12:08
>>182
プログラマは以外と規則正しい生活をしてるってことだな
188デフォルトの名無しさん:2010/12/17(金) 18:21:14
何が悲しくて初心者スレにプログラマが常駐せねばならんのだ
189デフォルトの名無しさん:2010/12/17(金) 18:22:19
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は、コンテキスト関係なく、サブクラスのインスタンスに
対して使用できるかどうかを示す。
191デフォルトの名無しさん:2010/12/17(金) 19:11:21
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>
192デフォルトの名無しさん:2010/12/17(金) 19:11:29
仕事でストレス溜め込んでるから、初心者相手に憂さ晴らししているプログラマが多いって証だろ。

ちゃんとカウンセラ常駐の、大手ソフト会社は、メンタルケアを行う事でストレスによる休職や離職が5年前は7%だったのが、昨年は0.7%に減少し、年間2億円のプラス効果が出たとかw
この会社は当然新卒にも大人気らしい。
193デフォルトの名無しさん:2010/12/17(金) 19:15:02
>>190
>比較判定で他の兄弟インスタンスの属性を参照するメソッドなどがprotectedになりうる。
というかそれしかないんよね
自分か仲間のオブジェクトをメソッド内に連れ込んだ場合に限ってそいつが喋れるってどんだけ秘密なの

ちなみにどれも __send__ で呼び出すことは可能なので、あんまり防御効果はない
194デフォルトの名無しさん:2010/12/17(金) 19:33:23
protectedてC++で言うprivateに使いのか?
195デフォルトの名無しさん:2010/12/17(金) 20:44:41
同名のローカル変数とprivateメソッドが同一クラスにあった場合、同クラス内からprivateメソッドを呼び出す方法ってある? evalとかの魔術的な方法ではなく正攻法で。

class C
def hoge
fuga = 0
# fugaメソッドを呼び出すには?
fuga
end

private
def fuga
"fuga"
end
end

puts C.new.hoge
196デフォルトの名無しさん:2010/12/17(金) 21:12:11
__send__(:fuga)
197デフォルトの名無しさん:2010/12/17(金) 21:54:27
いや、それ十分魔術だから
198デフォルトの名無しさん:2010/12/17(金) 22:06:42
スーパークラスからじゃなく
同じクラス内で同じメソッド名を作っておく意味ってあるの?
199デフォルトの名無しさん:2010/12/17(金) 22:07:29
ホントに動くねw

class C
def hoge
fuga = 0
# fugaメソッドを呼び出すには?
__send__(:fuga)
end

private
def fuga
"fuga private"
end
end

puts C.new.hoge
200デフォルトの名無しさん:2010/12/17(金) 22:11:08
>>198
いわゆる、ローカル変数名がたまたま被るという話だろう
それでいてローカル変数の名称も変更できずメソッド名も変更できずロジックの変更もできない
という特殊環境下でたかだか __send__ を魔術と抜かすんだからどうにもならん
201デフォルトの名無しさん:2010/12/18(土) 00:13:26
>>193
だから、「たいていのprotectedの使い方は間違い」だと疑ったほうが
いいんだよね。RailsとかRailsとか。
202デフォルトの名無しさん:2010/12/18(土) 00:42:49
間違った使い方のほうがruby本体より有名に成ったからなあ。
203デフォルトの名無しさん:2010/12/18(土) 01:18:23
どこから「だから」がきてるのかさっぱりわからん
204デフォルトの名無しさん:2010/12/18(土) 03:51:20
send は別に魔術でもなんでもないよね
メソッドを確実に呼ぶだけだ
ただまあちょっとばかし可視性とか無視してるが
205デフォルトの名無しさん:2010/12/18(土) 10:34:04
アクセス権限をかいくぐることがsendの主目的かよw
206デフォルトの名無しさん:2010/12/18(土) 11:20:42
昔なんか裏技とか言ってゲームやってたようなおっさんたちが嬉々として「裏技」に仕立て上げているという悲惨なメソッド
207デフォルトの名無しさん:2010/12/18(土) 13:02:57
実際はsendってどんな時に使うものなの?
208デフォルトの名無しさん:2010/12/18(土) 13:27:07
send は Object に定義されてて、ありがちな名前が被る可能性があるので実質 __send__ を使う

で、>>204の通りだろ
呼び出し制限に影響されないというのが差異で、単なるメソッド呼び出し
本来は、private メソッドを無理矢理使うときー、みたいな限定用途ではない
209デフォルトの名無しさん:2010/12/18(土) 13:31:52
「文字列で名前で指定されたメソッドを呼ぶ」とかな。
別にアクセス制限は関係ない。
210デフォルトの名無しさん:2010/12/18(土) 13:56:04
普通は動的プログラミングで使うだろ
privateメソッドにアクセスする用途で使ったのなんて
モンキーパッチで仕方なく書いた1回だけだ
211デフォルトの名無しさん:2010/12/18(土) 16:56:31
なのでやっぱり魔術的
212デフォルトの名無しさん:2010/12/18(土) 16:59:33
呼び出し制限に影響されずにメソッド呼ぶとか、動的プログラミングとか

privateメソッドを呼ぶ

の違いが初心者の私にはわかりません。
前者はほかに何ができることを言っているのでしょうか?
213デフォルトの名無しさん:2010/12/18(土) 17:17:57
呼び出し制限に影響されずにメソッド呼ぶ
privateメソッドを呼ぶ



動的プログラミング

というくくりで考えればいい。

上二つの違いは、何が目的なのかという解釈の違い。
二つのくくりの違いは、もう何もかも違うだろ。
214デフォルトの名無しさん:2010/12/18(土) 18:27:11
まあ、他の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'])


・ 「なんかスゴいからこれどっかで使おう!」とか考えない
・ 手段のために目的探したりしない、乱用厳禁
・ どうしても困ったときにはたぶんあなたの前に現れてくれるサンタさん
215デフォルトの名無しさん:2010/12/18(土) 19:34:57
なるほど、わかったきがします
説明&例をあげていただいて感謝
216デフォルトの名無しさん:2010/12/18(土) 23:30:23
>>214
へーー。わかりやすい。
217デフォルトの名無しさん:2010/12/19(日) 08:46:40
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スタイル?
218デフォルトの名無しさん:2010/12/19(日) 09:32:08
・ 「なんかスゴいからこれどっかで使おう!」とか考えない
・ 手段のために目的探したりしない、乱用厳禁
・ どうしても困ったときにはたぶんあなたの前に現れてくれるサンタさん

って書いてあるじゃん。もう少し考えてから書こうよ。いくら2chと言ってもさ。
219デフォルトの名無しさん:2010/12/19(日) 09:40:18
そもそもrubyインタプリタへのアクセスを許してる時点で危険も何もねえ
220デフォルトの名無しさん:2010/12/19(日) 11:02:37
Rubyは開発者のことを信頼しているっていう思想が根源にあるから
そんくらいで危険とか言われてもピンと来ないな
221デフォルトの名無しさん:2010/12/19(日) 11:15:13
__send__ はどう頑張ってもメソッドしか呼べないので $SAFE=1 で禁止されないな
まあそんなもんだと思う
__send__ に渡す引数が信用ならないなら自前でなんとかしてくれ
222デフォルトの名無しさん:2010/12/19(日) 15:57:13
>>220
>Rubyは開発者のことを信頼しているっていう思想が根源にあるから
C みたいな言い分ですね
223デフォルトの名無しさん:2010/12/19(日) 17:41:09
さっぽろでRubyKaigiあったじゃん、
ttp://regional.rubykaigi.org/sapporo03
これにMatzの発表資料と動画がないんだけど、公開されないのかな。
秘守契約とかあんの?
224デフォルトの名無しさん:2010/12/19(日) 17:59:45
>>222
matzはCプログラマ
225デフォルトの名無しさん:2010/12/19(日) 20:26:11
irb の使い方って、
b.rbというソースがあるとき
irb起動して
require './b'
(ruby1.92)
とソースを読ませてから
色々なことをするの?

参考url
オブジェクトの中身が知りたーい - takkan_mのNo planな日常
http://d.hatena.ne.jp/takkan_m/20101213/1292247476
226デフォルトの名無しさん:2010/12/19(日) 20:45:10
まあ一般的にはそうだ
227デフォルトの名無しさん:2010/12/19(日) 20:53:28
以下のような違い(疑問)に出会ったときに、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

228デフォルトの名無しさん:2010/12/19(日) 20:59:00
コンパイル前のC言語ソースのarray.c
229デフォルトの名無しさん:2010/12/19(日) 21:15:09
>>228
Oh.. Cを読まないとダメですか 自分にはまだちょっと早そうですね〜
リファレンスの文章で我慢します
レスありがとうございました
230デフォルトの名無しさん:2010/12/19(日) 21:15:25
>>227
ちょっと見たいだけなら、↓から覗くって手もあるよ。
http://rubydoc.info/stdlib/core/1.9.2/frames
231227: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の関数が分かる。
233デフォルトの名無しさん:2010/12/20(月) 01:14:22
Part26以前が過去ログから遡れなかったのでURLまとめてみた

Ruby 初心者スレッド Part 26
http://pc11.2ch.net/test/read.cgi/tech/1235727504/
Ruby 初心者スレッド Part 25
http://pc11.2ch.net/test/read.cgi/tech/1233369067/
Ruby 初心者スレッド Part 24
http://pc11.2ch.net/test/read.cgi/tech/1230783202/
Ruby 初心者スレッド Part 23
http://pc11.2ch.net/test/read.cgi/tech/1227123021/
Ruby 初心者スレッド Part 22
http://pc11.2ch.net/test/read.cgi/tech/1221467121/
Ruby 初心者スレッド Part 21
http://pc11.2ch.net/test/read.cgi/tech/1217952441/
Ruby 初心者スレッド Part 20
http://pc11.2ch.net/test/read.cgi/tech/1214498119/
Ruby 初心者スレッド Part 19
http://pc11.2ch.net/test/read.cgi/tech/1208100393/
Ruby 初心者スレッド Part 18
http://pc11.2ch.net/test/read.cgi/tech/1203658291/
Ruby 初心者スレッド Part 17
http://pc11.2ch.net/test/read.cgi/tech/1200472887/
Ruby 初心者スレッド Part 16
http://pc11.2ch.net/test/read.cgi/tech/1197120980/
Ruby 初心者スレッド Part 15
http://pc11.2ch.net/test/read.cgi/tech/1193298175/
Ruby初心者スレッド Part 14
http://pc11.2ch.net/test/read.cgi/tech/1188014743/
234デフォルトの名無しさん:2010/12/20(月) 01:14:37
Ruby初心者スレッド Part 13
http://pc11.2ch.net/test/read.cgi/tech/1183115034/
Ruby初心者スレッド Part 12
http://pc11.2ch.net/test/read.cgi/tech/1178167650/
Ruby初心者スレッド Part 11
http://pc11.2ch.net/test/read.cgi/tech/1174607679/
Ruby初心者スレッド Part 10
http://pc11.2ch.net/test/read.cgi/tech/1169542763/
Ruby初學者スレッド Part 9
http://pc10.2ch.net/test/read.cgi/tech/1164065622/
Ruby初心者スレッドPart8
http://pc8.2ch.net/test/read.cgi/tech/1159424939/
Ruby初心者スレッドPart7
http://pc8.2ch.net/test/read.cgi/tech/1154077799/
Ruby初心者スレッドPart6
http://pc8.2ch.net/test/read.cgi/tech/1147918197/
Ruby初心者スレッドPart5
http://pc8.2ch.net/test/read.cgi/tech/1143403165/
Ruby初心者スレッドPart4
http://pc8.2ch.net/test/read.cgi/tech/1137927749/
Ruby初心者質問スレPart3
http://pc8.2ch.net/test/read.cgi/tech/1125587131/
Ruby初心者質問スレPart2
http://pc8.2ch.net/test/read.cgi/tech/1107799347/
Ruby初心者質問スレPart1
http://pc5.2ch.net/test/read.cgi/tech/1100534824/
235デフォルトの名無しさん:2010/12/20(月) 10:20:59
2004年に既に1.9系ってあったんだな
まるで普及してない・・・
236デフォルトの名無しさん:2010/12/20(月) 10:26:45
1.9.0 は完全開発版でベータどころかナイトリービルドレベルだから普及も何もないぞ
普及は 1.9.1 から数えてくれ
ttp://www.ruby-lang.org/ja/news/2009/01/30/ruby-1-9-1-released/
来年の1月30日で2歳だ
237デフォルトの名無しさん:2010/12/20(月) 10:30:33
>>236
あ、そうなんだ
無知でスマソ
238デフォルトの名無しさん:2010/12/20(月) 10:32:55
ついでに質問だけど、1.9.1が安定版なら、1.9.2は開発版? で1.9.3が安定版?
239デフォルトの名無しさん:2010/12/20(月) 10:41:21
>>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にスライドすると予測されてる
240デフォルトの名無しさん:2010/12/20(月) 11:00:00
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の新機能です
くらいで悩む程度になって気楽
241デフォルトの名無しさん:2010/12/20(月) 11:08:04
いつの話だよw2年前か?
242デフォルトの名無しさん:2010/12/20(月) 11:12:31
日常的に1.9.1や1.9.2を使って「いろいろな」gemを扱ってれば
わりとピキッと来ることが多いはずなんだけど
243デフォルトの名無しさん:2010/12/20(月) 11:18:24
日常的に使ってるが今やそんなことはほとんどないなあ
例えばどんなgemか3つ4つ挙げてみてよ
244デフォルトの名無しさん:2010/12/20(月) 12:02:01
そういや最近の新しいのはないな
文字エンコーディングが変なのは時々ひっかかるけど
245デフォルトの名無しさん:2010/12/20(月) 12:20:32
なんだかんだいってrailsだよりだからいまさら
246デフォルトの名無しさん:2010/12/20(月) 12:26:33
ライブラリの更新履歴見ると「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を使用すべし。
249デフォルトの名無しさん:2010/12/20(月) 14:11:42
>>239
rubyのバージョンの数字が2桁にならない保証ってもう過去の話?
250デフォルトの名無しさん:2010/12/20(月) 17:39:07
日常的に使ってない初心者な俺は
amazon-ecs(+Hprocit)で >>240 みたいな目にあった
251デフォルトの名無しさん:2010/12/20(月) 20:03:32
class Foo
 def << name, price
  puts "#{name}=#{price}"
 end
end

foo = Foo.new
foo << "smile", 100

エラーが出ます。なぜですか?
./main.rb:10: syntax error, unexpected ',', expecting $end

252デフォルトの名無しさん:2010/12/20(月) 20:20:37
説明不足なので補足。
foo << ["smile", 100]
foo.<< "smile", 100
という書き方をするメソッド定義はわかるのですが、
foo << "smile", 100
という書き方をするためのメソッド定義が分かりません。

253デフォルトの名無しさん:2010/12/20(月) 20:27:27
<<とか一部のメソッド名は2項演算子の形式をとるから。
254251:2010/12/20(月) 21:06:25
何とかなりませんか?
メニューに"smile"、100円を足す正しいメソッドは
mac.menu << "smile", 100
だと思うのですが、どう考えてもこの表記では書けません。
255デフォルトの名無しさん:2010/12/20(月) 21:16:54
構文の問題なので、なんともなりません。
256デフォルトの名無しさん:2010/12/20(月) 21:57:37
へー、こんな制限があるんだ
知らなかった
257デフォルトの名無しさん:2010/12/21(火) 00:16:43
DSLにかぶれると

menu :mac do
item 'smile', 100
item 'potato', 50
end

とか書いてしまいそうだ。
258デフォルトの名無しさん:2010/12/21(火) 03:24:25
PostgreSQLを使おうとpgを使っているのですが、SELECT ary FROM tableの結果
aryだけを配列としたいのですが、昔はPGResult.resultっていうのがあったみたいなんですが
今はないみたいで PGResult.each do ふにゃらら endでやっているのですが、
これで正しいのでしょうか? なにか釈然としません。
259デフォルトの名無しさん:2010/12/21(火) 03:32:43
ふが
ふが
ふが
260デフォルトの名無しさん:2010/12/21(火) 06:26:53
>>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

261デフォルトの名無しさん:2010/12/21(火) 09:14:31
プログラム的な話ではないのですが、Rubyについて質問させてください。

よくRuby(Rails)が使用されている代表的なWebサービスとして、
Twitterが挙げられますが、以前はすべてRubyで書かれていたけど、
最近はフロントエンドがRubyで、バックエンドがScalaだと聞きます。

この場合のフロントエンド、バックエンドというのはどの部分を指すのでしょうか?
素人考えにはフロントエンドがUI、バックエンドがDBかなぁとか想像してますが、
そんな分け方するのかな?と疑問に思いました
262247: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をインスコすべきか,悩みます。
とりあえず,お礼とご報告まで。
263デフォルトの名無しさん:2010/12/21(火) 12:47:16
>>262
rvm入れてgem環境分けておけばいいよ
Rails3が原因なら外しておける
264デフォルトの名無しさん:2010/12/21(火) 14:04:33
古い時代にprevとlastの両方があったわけじゃないので、
使っているActiveSupportのバージョンに応じてprevとlast使い分けて
くだされ。
2.3.8 は移行を意図しているので両方あるはずだけど。

265デフォルトの名無しさん:2010/12/21(火) 17:15:46
こんな流れの中質問するのも申し訳ないんだけど、
公式リファレンスのEnumerable#max {|a, b| ... }の説明でめちゃくちゃ混乱してるんだ
なぜブロックのパラメータはふたつ?とか
「ブロックの値は〜期待してます。」の意味とか
全然理解できない
誰か使い方を教えてください
266デフォルトの名無しさん:2010/12/21(火) 17:23:55
foo が Enumerable だったとして
foo.max は
foo.max{|a,b|a<=>b} と同じ

比較のための値の計算の方法じゃなくて、大小比較の方法をブロックで外付けしてやるわけ。
267デフォルトの名無しさん:2010/12/21(火) 17:34:06
>>265
1. 数値の配列を sort メソッドを使わずに自力でソートするプログラムを書く
2. 1 を拡張して任意のオブジェクトの配列をソートするプログラムを書く

ここらへんまでやれば、たとえ 1 と 2 がうまく書けなかったとしても
max やら sort みたいに比較関数を渡すメソッドの使い方ぐらいは理解できるはず
268265:2010/12/21(火) 18:54:51
>>266
比較方法をブロック内に書くのか
全然気づきませんでした。ありがとう。

>>267
あとでやってみます
269デフォルトの名無しさん:2010/12/21(火) 21:01:21
>>261 ってスレ違い?
270デフォルトの名無しさん:2010/12/21(火) 21:44:18
まあだいたいはスレ違い
Rubyに絡めてくれれば乗る人もいたんだろうけど…
271デフォルトの名無しさん:2010/12/21(火) 21:51:19
>>270
そうですかー
>>261が理解出来たら、じゃあなんでRubyじゃダメだったのか、単に速度が遅かったからか、大量のつぶやきをさばけなかったのか、もしくは動的型によるリファクタのしづらさとか、それとももっと違う原因なのか、という部分も知りたいと思ってました

ここじゃスレ違いだとすると、どこで聞くのが適切でしょうか?
272デフォルトの名無しさん:2010/12/21(火) 21:52:14
HTTPでクライアントに応対する部分がフロントで、
DBやファイルや他のデーモン・サービスと連携する部分がバック
だと思えばいいんじゃないかね。
273デフォルトの名無しさん:2010/12/21(火) 22:13:27
基本RubyとRailsはCPUコストやメモリコストが他のスクリプト言語や他のコンパイル済み言語よりも高い
これは単純に(ある程度の)足し算というレベルで高い
ごっつい処理をたくさんの人に提供、とかいうのだと、最終的にPHPのほうが最低2倍は捌ける人数多いと思う

でも、それでもRubyを使う人がいる
この世のあらゆるプログラムをCで記述しないのと同じような理屈
Rubyで初期開発して、処理負荷が間に合わなくなったら他の言語に移る、というのは
Ruby的にはまったく悲しむべき問題ですらない
むしろRubyの優位性を示す出来事であるとすら思う人が多いはず

公開プロダクトを最初から最後までRubyで運用し倒しましたとかいうのは
その人がお金持ちか基地外か過疎プロダクトかどれか
274デフォルトの名無しさん:2010/12/21(火) 23:04:46
>>273
matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
275デフォルトの名無しさん:2010/12/21(火) 23:52:11
Ruby(onRails)を高速化すれば戻って来てもらえると本気で思ってる節があるな
276デフォルトの名無しさん:2010/12/22(水) 01:13:36
Rubyの適用範囲がもっと広ければなあと考える事は
特に作者としては自然なことだと思うが
277デフォルトの名無しさん:2010/12/22(水) 08:07:10
http://jp.rubyist.net/magazine/?0013-BundledLibraries
Net::HTTP.Proxy メソッドは、
Net::HTTP を継承したクラスを作成して、
作成した クラスを返します。
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>'
279デフォルトの名無しさん:2010/12/22(水) 08:55:56
ああ、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
>>279
マニュアルじゃなくて雑誌記事でわ?
281デフォルトの名無しさん:2010/12/22(水) 09:13:01
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
ありがとうございました。
リファレンスちゃんと理解できるよう出直します。

私のところでは、化けずに出力されてます。
283デフォルトの名無しさん:2010/12/22(水) 09:33:59
どっちかというと、File にエンコーディングを指定できない(または固定しない) PStore 側がへなちょこなんだと思う
ユーザー側にあんまり非はないし、この対処をマニュアルから読み取るのは不可能なんじゃないかな
284デフォルトの名無しさん:2010/12/22(水) 10:19:08
>>275-276
言語のユーザーや仕事の開発者としては、Ruby向いてないところに差し迫ったら乗り換えて当然と思ってしまうけど
Matzは立場上(本気でそう思ってなくても)悔しがらないとあかんのでは?w
285デフォルトの名無しさん:2010/12/22(水) 10:44:23
>>277
>メソッド中に動的にクラスを作成して、
>そのクラスを返すということが可能です。
>
>このメソッドの中にクラスって意味がわかりません。

メソッドの中でクラスを作成し、それを返す。ただそれだけ。

これはもとのマニュアルが悪いな。「動的に」なんて初心者にわかるはずがない。
直すなら
「メソッドの中でクラスを作成して返します」
「メソッドを実行するたびにクラスを作成して返すことができます」
とか。
286デフォルトの名無しさん:2010/12/22(水) 11:18:44
>>284
それは単に表面的なスタイルの問題じゃないの?
インデント強制だからPython は嫌だとか言ってる人たちを思い出すな
287デフォルトの名無しさん:2010/12/22(水) 11:20:24
どこをどう読めば>>284がスタイルの問題になるのかまったくわからない。
アンカーミスだよな?
288286:2010/12/22(水) 11:22:51
>>287 すまん。確かに275-276が違う所をさしてるように見えてしまった
289デフォルトの名無しさん:2010/12/22(水) 12:22:12
最近Rubyはじめたんですが、クロージャのような無名の処理はみなさんどうやって文書化してます?
290デフォルトの名無しさん:2010/12/22(水) 12:27:25
ソースがドキュメント
291デフォルトの名無しさん:2010/12/22(水) 15:23:46
jrubyのnkfが壊滅的なのですがどうすればいいんでしょうか
jrubyで文字コード変換するなということなんだろうか
292デフォルトの名無しさん:2010/12/22(水) 16:21:18
>>291
もうJava標準APIを呼んでしまえ。
String#getBytesとかエンコード指定付きコンストラクタとか
Reader/Writerとか。
293デフォルトの名無しさん:2010/12/22(水) 19:09:44
>>274
>matzはtwitterがscalaを採用したことを、負けたと思ってるみたいだけどな
うそだぁ
ソースは?
294デフォルトの名無しさん:2010/12/23(木) 07:23:26
>>291
そんなことはない
現在のJRubyの動作は基本的に完全だと外人さんも太鼓判を押している
295デフォルトの名無しさん:2010/12/23(木) 07:46:49
128文字でお釣りが来る国の人の言うことはほんとに当てにならんからのう…

まあNKF.guess組み込んで「エンコーディング対応しました」とか言う日本人もいるからどっちもどっちだが
案の定ISO-8859-xで盛大に誤爆して現在もコードまだ直ってない
君のことだよMechanize
296デフォルトの名無しさん:2010/12/23(木) 09:55:16
>>294
nkfみたいな文脈で外人の太鼓判は信用できないwww
297デフォルトの名無しさん:2010/12/23(木) 11:55:09
railsの機能をirbで使うにはどうしたらいいのでしょうか?
たとえば、
rubyでhtmlタグを文字列から除去する方法(正規表現) - YomuKaku Memo
http://memo.yomukaku.net/entries/51
のstrip_tagsメソッド

irbではエラー
str= open("http://railstutorial.org/ruby-on-rails-tutorial-book")
p strip_tags str

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せんと。
300デフォルトの名無しさん:2010/12/23(木) 12:41:22
Rails3をインストールして、
適当にアプリ作る。
そこで
rails console
でrailsがバックにあるirbが使える
301デフォルトの名無しさん:2010/12/23(木) 13:59:31
rails consoleでもObjectにActionView::Helpers::SanitizeHelperが
includeされるわけじゃない(本来ビューレンダリング用のものだし)ので、
そこは必要。

ただし、helper というビューオブジェクトが存在するので、include
しなくても
helper.strip_tags('...')
とは出来る。
302デフォルトの名無しさん:2010/12/23(木) 14:20:31
そういうのを調べるのってリファレンスを見てるんですか?
日本語のまとまった情報とか無いですよね・・・
303デフォルトの名無しさん:2010/12/23(木) 15:24:50
strip_tags については、リファレンスで SanitizeHelper のものだと
分かるので、あとはそれを使う環境を整えるために試行錯誤するだけ。
304デフォルトの名無しさん:2010/12/24(金) 01:21:41
まあそのへんはRailsスレに行けばわか…わか…、

まあ、Railsも使っててRuby本体にも造詣のある人は少なくないだろうし
わかるんじゃないかなあと思う
RailsのことはRailsスレでやれバーカバーカというよりは、単に遭遇確率の問題
305デフォルトの名無しさん:2010/12/24(金) 13:21:04
irbでrequire '"action_view"; include ActionView::Helpers::SanitizeHelperしただけだと
足りないメソッドあるし使えないから面倒くさい

rails consoleのhelperから使った方がいいな

前はrails consoleから簡単に使えないメソッドもあったし(確かcontrolに依存していたり、内部で擬似的にリクエスト発生が必要だったり?)
そういうのは徐々に改善されていっているようだけど
306デフォルトの名無しさん:2010/12/25(土) 00:35:43
Rubyのソースファイルと実行結果が一緒に表示できるxmpfilterが便利
インストール。
$ gem install rcodetools

307デフォルトの名無しさん:2010/12/25(土) 11:38:05
>>306
[ruby-list:47063] Ruby逆引きハンドブック & xmpfilter (was: Re
http://permalink.gmane.org/gmane.comp.lang.ruby.japanese/6175


これか、よくブログでコードに

1 + 2 # => 2

と表示されるのってxmpfilterなのか
エディタのサポートあれば便利だな
308デフォルトの名無しさん:2010/12/25(土) 11:49:39
言えない、手書きでやってたなんて絶対に言えない
309デフォルトの名無しさん:2010/12/25(土) 14:46:17
日頃Windows版でのテキストファイルの読み込みの遅さに辟易していましたが
ふとバイナリモードにしてみたところ、これまで30秒程かかっていた読み込みが
1秒足らずで終わりました。後から強制エンコーディングするにもおつりが出る速さです。
なぜこんなにテキストモードのI/Oは遅いのでしょうか?
310デフォルトの名無しさん:2010/12/25(土) 14:55:35
実装者に文句言ってけれ
知らないよ
311デフォルトの名無しさん:2010/12/25(土) 15:06:57
> なぜこんなにテキストモードのI/Oは遅いのでしょうか?
そりゃ1バイトずつ内容チェックしていって
CR LF の並びがあれば "\n" に変換するという「無駄」な処理があるからに決まってるじゃん
変換がないだけならただ読んで終了だもの
312デフォルトの名無しさん:2010/12/25(土) 15:12:05
データを読んだからにはそれに対するメインの処理を施すわけだが、
テキストモードで「改行コードを置換する」だけの処理がメインの処理よりも時間がかかるなんてことがあるのだろうか!
313デフォルトの名無しさん:2010/12/25(土) 16:29:23
判断の処理とかさせるからだろ、
フールセーフ(アフォでも安全)というか、
自動判別させる処理とか裏で動いているから、
314デフォルトの名無しさん:2010/12/25(土) 16:30:35
下のようにスクリプトファイルにテキスト名を指定せずにコンソールで指定するにはどうしたらいいのでしょうか?

File.open("sentence.txt").each{|line| ...
315デフォルトの名無しさん:2010/12/25(土) 16:46:34
コンソールからファイル名を読み込んで変数に代入しておき
openにその変数を指定するとかではなく?
316デフォルトの名無しさん:2010/12/25(土) 16:55:22

そういう一手間がいるんですね。
C:\>xxx.rb xxx.txt > xxx1.txt
みたいなわけにはいかないのでしょうか?他の言語かじったときのイメージでこんな
かんじでいけなるのかと勝手に思ってたのですが。
ぐぐってもでてこないのだから、ダメなんでしょうね。
317デフォルトの名無しさん:2010/12/25(土) 16:59:09
テキストモードだとファイルの読み込み30秒、メインの処理1秒でした。
ちなみにCSVファイルの加工です。
318デフォルトの名無しさん:2010/12/25(土) 17:04:40
そもそもコンソールってなんじゃらほ

スクリプト起動時の引数に指定してそれを利用するパターン(推奨)

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にそのまま渡してはいけない
319デフォルトの名無しさん:2010/12/25(土) 17:05:37
>>316
それは出力だろ
出力ファイルの名前のことなのか
君のレスは情報の多くが欠落している
欠落した情報でググっても何も出てくるはずもない
320デフォルトの名無しさん:2010/12/25(土) 17:06:51
>>314
普通に書けば、
while line = gets
 puts(line)
end

組み込み変数で明示的に書けば、
while line = $stdin.gets
 $stdout.puts(line)
end

ドヤ顔したければ、
while gets; puts $_; end
321デフォルトの名無しさん:2010/12/25(土) 17:08:09
>>318
初心者スレに初心者がレスすると不幸を生むから見てるだけのほうがいい。
322デフォルトの名無しさん:2010/12/25(土) 17:12:30
>>316
Rubyの標準入力はIOオブジェクトとしてグローバル変数$stdinからアクセス可能
Rubyの標準出力はIOオブジェクトとしてグローバル変数$stdoutからアクセス可能
puts や print のデフォルト出力先は $stdout
スクリプト起動時の引数はARGV
「起動時引数をファイルとみなして開いたIOオブジェクトとみなすが、空の場合は標準入力に切り替える」のはARGF

…ていうか、標準入力や標準出力、起動時の引数を知ってればこれにたどり着くだろうから、
もしかして「コンソール」という言葉を知ってて呼び名を知らないんか
323デフォルトの名無しさん:2010/12/25(土) 17:13:37
関係ないけど、最近の若いもんにちょっとテキスト処理のプログラム課題を与えたら、
とりあえずopenで開く人が多くて、なんだかなぁって感じがする。
普通は標準入出力使ってフィルタを作るだろ…言わなくてもそうなるだろ…?
どうしてopenつかうんだよもぉぉぉぉぉ!
324デフォルトの名無しさん:2010/12/25(土) 17:15:08
>>314の回答は>>318だと思う
open して read する

  対象のファイルの名前

を"コンソール"から指定したいのだろ
325デフォルトの名無しさん:2010/12/25(土) 17:16:27
あとストリームを一気に読み込もうとする人!
なんなんだよ!1行ずつ読み込んで1行ずつ処理しろよぉ!
そうしたほうが省メモリだろぅ!
「でもメモリいっぱいあるし」
まぁそうだけどさぁ…><;
メリークリスマス!
326デフォルトの名無しさん:2010/12/25(土) 17:18:58
お前の言ってるコンソールは、もしかしてコマンドライン?
327デフォルトの名無しさん:2010/12/25(土) 17:19:24
>>324
File.open("sentence.txt").each{|line|
# ここで読み込んだ内容を別途ファイルに保存したいが、
# 書き方がわからないので空欄にして質問しました
}

という質問の可能性を排除するような視野の狭い人は初心者スレで回答すべきではない
そもそも読み込み対象のファイル名は既に記載されてるではないか
なんでそれをユーザー入力させると誤読するのかマジ理解不能
328デフォルトの名無しさん:2010/12/25(土) 17:22:01
なんだ冬休みか...
329デフォルトの名無しさん:2010/12/25(土) 17:22:03
>スクリプトファイルにテキスト名を指定せずにコンソールで指定
330デフォルトの名無しさん:2010/12/25(土) 17:23:55
>>327
いくつもの可能性があるからいちいち聞きなおさにゃならん
記載されてるファイル名をベタ書きしたくないと普通は解釈する
331デフォルトの名無しさん:2010/12/25(土) 17:24:59
はいはいはい、引数に何か指定させようとする馬鹿は全員帰ってね
それは元質問の「スクリプトファイルにテキスト名を指定」で既に行われてるから
引数によるファイル名の指定をやりたくないという質問なのこれは
332デフォルトの名無しさん:2010/12/25(土) 17:27:29
>>331
テキスト名をコンソールで指定したい、だからファイル名を対話的に入力したいんだろ要は
>>318の後半でいいじゃん
333デフォルトの名無しさん:2010/12/25(土) 17:30:22
でも>>316みたいにやりたいのなら引数で渡したいってことじゃないのか
334デフォルトの名無しさん:2010/12/25(土) 17:30:39
コンソールって言ったら普通は端末(エミュレータ)だろ
引数から入力したいならそういう風に言うはずだから、端末から入力する方法を答えればいい
とりあえずは gets でいいんじゃね
335デフォルトの名無しさん:2010/12/25(土) 17:42:19
とりあえず

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を読む限り、コンソールという概念を勘違いしてるという読みは正しいと思う
336デフォルトの名無しさん:2010/12/25(土) 17:46:05
ruby -n が欲しいんじゃないかなー
>>316の「ほかの言語」はawkとかだと推測
337デフォルトの名無しさん:2010/12/25(土) 17:53:53
てことで
「○○を××して△△するプログラムを書こうとしてここまでできたのですが、
●●の部分を◇◇にする方法がわかりませんてめえら勝手に盛り上がってないでとっとと教えろカスが」
とか言ってくれると僥倖
たぶんこのへんのたいていのパターンはRubyで書けるし別に喧嘩してるわけでもないのでさくっと情報くれ
338デフォルトの名無しさん:2010/12/25(土) 18:26:49
美女を籠絡して満喫するプログラムを書こうとしてここまでできたのですが、
一物の部分をギンギンにする方法がわかりませんてめえら勝手に盛り上がってないでとっとと教えろカスが
339デフォルトの名無しさん:2010/12/25(土) 19:43:09
340デフォルトの名無しさん:2010/12/25(土) 21:14:27
>>313
× フールセーフ(約2,580件)
○ フールプルーフ(耐馬鹿性, fool proof, 約5,120,000件)
○ フェイルセーフ(間違っても安心, fail safe, 約1,590,000件)
341デフォルトの名無しさん:2010/12/25(土) 21:15:53
>>313自身が馬鹿だということでフールセルフという言葉を授けよう
342デフォルトの名無しさん:2010/12/25(土) 22:31:01
>>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がくることは保証されていません。別のフィールド(大文字のみ)か、
レコード区切り(//)が期待されます。
343デフォルトの名無しさん:2010/12/25(土) 22:39:56
>>342
入力元となるデータが限定されており、そのサイズが十分に予想できてかつメモリに乗せてもかまわないのなら全て読み込んで処理すればいい。
344デフォルトの名無しさん:2010/12/25(土) 22:46:16
流れてくるデータが1行単位じゃないのなら、1行単位で実処理するのは単にアホだろ
データ区切りまでバッファしてから処理すればいい
345314,316:2010/12/25(土) 22:52:55
いやー、すんません。大混乱を招いたようで。

>>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) }
346デフォルトの名無しさん:2010/12/25(土) 22:55:41
とにかく
hoge.rbに
p ARGV
と書いて
ruby hoge.rb in.txt out.txt
と実行してみろ。

そしたら後は
ARGV
でググレ。
347345:2010/12/25(土) 23:19:31
サンクスです。^O^

コマンドラインに引数ですか。コンソールとかコマンドプロンプトとかファイルとかで
延々とググッてました。
348342:2010/12/26(日) 09:03:38
>>343,344
ありがとうございます。元のデータはせいぜい数MBなので、全部読んでもいいと思いますが、
区切りまでバッファするというのは考えてなかったので、それでやってみます。
349デフォルトの名無しさん:2010/12/26(日) 22:05:55
そろそろゴルファーとワンライナー信者による ruby -p -e を使ったテクニカルなフィルタがご覧になれます
350デフォルトの名無しさん:2010/12/27(月) 01:05:14
-n, -p, -a はやらず嫌いはもったいない
来年の漏れの目標はなぜか sed, awk の習得です
351デフォルトの名無しさん:2010/12/27(月) 08:25:06
sed awk して船山に上る
352デフォルトの名無しさん:2010/12/27(月) 08:39:40
>>339
グロ中尉
353デフォルトの名無しさん:2010/12/27(月) 09:03:22
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
だけで関数追加できちゃうんだね。
354デフォルトの名無しさん:2010/12/27(月) 09:32:29
オープンクラスってRubyで初めて知ったんだけど、他にメジャーな言語で採用してるのってある?JSとかそうだったかな
なんつーか素人から見ると、大事なところをこわしそうで怖いよねw
355デフォルトの名無しさん:2010/12/27(月) 11:20:33
JSはプロトタイプ自由にいじれるんだっけ
356デフォルトの名無しさん:2010/12/27(月) 12:02:52
そもそもJSの場合、真の意味でのクラスは存在しないからなぁ
357デフォルトの名無しさん:2010/12/27(月) 12:54:32
真の意味でのクラスってなんだよw
358デフォルトの名無しさん:2010/12/27(月) 12:56:58
分からないんならググれよ
359デフォルトの名無しさん:2010/12/27(月) 13:20:03
いくらグーグルでもお前の妄想なんてヒットしないのだがw
360デフォルトの名無しさん:2010/12/27(月) 14:56:32
全板強制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とか条件文を使わずには無理でしょうか?
362デフォルトの名無しさん:2010/12/27(月) 15:36:06
$ 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 }
とか。
364361:2010/12/27(月) 16:50:29
>> 362, 363
ありがとうございました。
>>363では若干問題が...
somedayが2010.8.25の場合は,本日を基準にすると,12.25が既に到来しているので,
5こ列挙されて最後が2010.12.25になってほしいのです。

逆に>>362だと2010.12.29はまだ到来していないので,列挙してほしくない。

いずれにしても,示唆に富んだアドバイスをありがとうございました。
(条件文無しでは無理そうですね。)
365デフォルトの名無しさん:2010/12/27(月) 18:25:00
メインの処理内に直接条件文を記述したくないということなら
そのようなイテレータを定義するのもありかもよ
条件文はイテレータ定義内に書いておき
メインの処理ではイテレータを使うとか
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なんだろうけど。
367デフォルトの名無しさん:2010/12/27(月) 22:45:56
activesupportってなんでアンダースコア入ってないの?他は入ってるよね
368デフォルトの名無しさん:2010/12/27(月) 22:51:36
require 'active_support' でも動作するんだから文句言うな
途中でgem名を変更されるよりはマシだ

ActiveSupportは物凄く古いgemライブラリで、
これができた頃はまだgemライブラリの命名規則(規則というか、傾向)すらなかったのだ
ActiveSupport式の命名法(AaaBbbCcc→aaabbbccc)は aaa_bbb_ccc 式の淘汰圧に負けたのよ
369デフォルトの名無しさん:2010/12/28(火) 10:42:09
しまった、Date.today.mjdがゾロ目になる日に書き込もうと思っていたのに忘れてた。
370デフォルトの名無しさん:2010/12/28(火) 19:37:12
module M
def mes
puts "mes!"
end
end

と、自作ではなく既存のライブラリで定義されてるmesメソッドを
includeやextendで「オブジェクトを汚染する」ことなく一発で利用することはできますか?
M.mes みたいに使えるといいんですけど

事前に module M; module_function :mes; end するというのは今回不可です
371デフォルトの名無しさん:2010/12/28(火) 19:43:59
Object.new.tap{|o| o.extend M}.mes

Ruby1.8.6とかでどうすればいいのかは知らんw
372デフォルトの名無しさん:2010/12/29(水) 01:00:39
mkmfを用いたextconf.rbってautoconfみたいな物っていう認識でOKですか?
extconf.rbのオプションに--prefixを取らせたいのですが、どうやったら出来るでしょうか?
373デフォルトの名無しさん:2010/12/29(水) 01:51:52
汚染することなくつかいたいなら、
デザインパターンのどれかをつかう。
374デフォルトの名無しさん:2010/12/29(水) 06:18:06
デザインパターン関係ないだろ
モジュールに定義されたメソッドを呼べないのはRubyの制限だ
375デフォルトの名無しさん:2010/12/29(水) 06:41:14
え?
376デフォルトの名無しさん:2010/12/29(水) 08:00:12
え?
377デフォルトの名無しさん:2010/12/29(水) 08:39:45
>>372
現在インストールされているRubyの環境を使う、
拡張ライブラリ生成用autoconfという感じではないだろうか。
インストールされているRubyとは異なる場所に拡張ライブラリ
を入れたいということ?
378デフォルトの名無しさん:2010/12/29(水) 12:49:16
>>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

379デフォルトの名無しさん:2010/12/29(水) 12:49:57
> includeやextendで「オブジェクトを汚染する」ことなく一発で
380デフォルトの名無しさん:2010/12/29(水) 13:27:45
この「事前」は 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から順番に出力したいのですが、どうしたらいいでしょうか?
解答お願いします。
382デフォルトの名無しさん:2010/12/29(水) 18:53:41
中身を?ハッシュを?値を?
というか例が無茶苦茶すぎ
383デフォルトの名無しさん:2010/12/29(水) 18:55:40
キーの重複を考慮しないとして、
d.inject(&:merge).sort
出力は好きなように。

384デフォルトの名無しさん:2010/12/29(水) 18:56:18
すみません
ハッシュの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って何?
388デフォルトの名無しさん:2010/12/29(水) 19:15:48
わかりにくく書くための魔法
ゴルファー御用達
他人に見せる説明や公開するコードでこれを使う人間は周りから避けやすくなるので便利
389デフォルトの名無しさん:2010/12/29(水) 19:19:17
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>
390デフォルトの名無しさん:2010/12/29(水) 19:20:19
うまく行けました
ありがとうございます
391デフォルトの名無しさん:2010/12/29(水) 19:39:44
>>388
ググってもHash#mergeしか見つからなかったorz
392デフォルトの名無しさん:2010/12/29(水) 20:24:40
>>391
つ Symbol#to_proc


知らないとググりにくいよねこれ。
393デフォルトの名無しさん:2010/12/29(水) 21:41:38
>>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)
394デフォルトの名無しさん:2010/12/29(水) 21:47:32
>>392
あーそうかブロックか。
助かりました。
395デフォルトの名無しさん:2010/12/29(水) 21:49:33
>>393
Symbol#to_procでググって見つけたこれとかですかね?
ttp://d.hatena.ne.jp/keyesberry/20080917/p1
396デフォルトの名無しさん:2010/12/29(水) 22:17:40
>>395
そのページ自体はいいんだが、

> そうか暗黙の型変換だよ
> &を前置したからRubyは
> それが手続きオブジェクトであると期待したんだ
> でもその期待に反して&を伴っていたのはシンボルだったので
> そのオブジェクトに手続きオブジェクトへの変換を要求
> つまりto_procメソッドを自動で送信したんだ

ここが>>393

> (特にこの間)

にあたるのだろうが説明出来ていない気がするw
397デフォルトの名無しさん:2010/12/30(木) 10:12:49
def to_proc
  Proc.new { |obj, *args| obj.send(self, *args) }
end
398デフォルトの名無しさん:2010/12/30(木) 10:15:12
1.8だとブロック引数のスコープ汚染があるから便利なんだけど
1.9で直ったから別にいらないな>to_proc
399デフォルトの名無しさん:2010/12/30(木) 13:15:52
yieldってブロックを渡したとき、
引数のように受け取った受け取り側のメソッドが
その受け取ったメソッド自身で、受け取ったブロックを実行する命令のことか。
400デフォルトの名無しさん:2010/12/30(木) 13:35:02
まあ、そんなとこ
401デフォルトの名無しさん:2010/12/30(木) 15:59:10
>>397
るびまんのリファレンスのSymbol#to_proc 読んでもわからんから、それ書いておいて欲しす
http://rurema.clear-code.com/1.8.7/method/Symbol/i/to_proc.html
http://rurema.clear-code.com/1.9.2/method/Symbol/i/to_proc.html

実装そのまま書くのアレなら、こんな感じに動作しますというような擬似コードでいいから

それとto_procの説明なのにto_procがないしこれも書くかリンク貼っといておいて欲しい

841 名前:デフォルトの名無しさん[sage] 投稿日:2010/12/30(木) 11:18:18
リファレンス嫁
http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html
> ruby 1.7 feature: version 1.7 では、to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます
> (デフォルトで Proc、Method オブジェクトは共に to_proc メソッドを持ちます)。to_proc はメソッド呼び出し時に実行され、
> Proc オブジェクトを返すことが期待されます。

scrAPIって1.9に対応してる?

402デフォルトの名無しさん:2010/12/30(木) 16:00:24
るりまだった
るびまんのリファンレンスってなんだw
403デフォルトの名無しさん:2010/12/30(木) 17:25:29
yieldとcallbackの違いについて教えて下しゃれ
404デフォルトの名無しさん:2010/12/30(木) 20:43:04
CUIのアプリを作ってるんですが、
WindowsとLinuxってデフォルトの文字コードが違いますよね…?
そいで、ソースコードはUTF-8で書いて、OSを調べてkconvで適切な文字コードに変換して出力しないといけないんですけど、
putsのたびに文字コードを変換するの面倒ですよね?
そいで、String#to_sをオーバーライドして文字コード変換するようにしたらいっかなー?なんて思ったんですけど、
なんかほかにいいやり方ありますか?
405デフォルトの名無しさん:2010/12/30(木) 20:59:29
putsをオーバーライドすればいいじゃん
406デフォルトの名無しさん:2010/12/30(木) 21:50:46
>>404
まず開発者に要望を出す

・ruby cygwinでLANG=ja_JP.UTF-8してUTF-8で使う
・出力、入力でCodePageに合わせて文字コードを変換
https://github.com/jugyo/termtter/blob/master/lib/termtter/system_extensions/windows.rb
この例ではprintとputsを置換してる
407デフォルトの名無しさん:2010/12/30(木) 23:56:17
ruby1.9だと自動変換してくれるよ>コンソール
408デフォルトの名無しさん:2010/12/31(金) 00:01:54
>>403
どう混同しているの?
409デフォルトの名無しさん:2010/12/31(金) 03:01:15
クラス変数とクラスインスタンス変数の使い分けが分かりません。。

継承させたい場合はクラス変数、
継承させたくない場合はクラスインスタンス変数
程度の認識で良いのかな?
あとはクラス変数はトップレベルのスコープから影響受けるとか。

他には何か違いがあるのでしょうか?
410デフォルトの名無しさん:2010/12/31(金) 03:05:51
>>409
誰かが自分のタイ焼きのアンコを食べたら、なぜかおまいのタイ焼きのアンコもなくなってもいいならクラス変数を使えばいい。
411409:2010/12/31(金) 03:20:02
>>410
他の言語(Javaとか)ではそれが通常の動作だと思います。

クラスインスタンス変数の場合、
同じクラスの異なるオブジェクトで共有することすら出来ないので
使い道があるのかさえ分かりません。

Javaでいうクラス変数の役割を期待する場合は、クセがあってもクラス変数を使わざるを得ないと思うのです。

私の頭が固いだけなのでしょうか。
412デフォルトの名無しさん:2010/12/31(金) 03:24:08
( ゚д゚)
413409: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

やはりこちらが自然だと思います。
414デフォルトの名無しさん:2010/12/31(金) 06:19:36
@@って使ったこと無いけどいつ使うと美味しいの?
415デフォルトの名無しさん:2010/12/31(金) 07:46:52
416デフォルトの名無しさん:2010/12/31(金) 08:04:49
>>413
悪いけど、何を言いたいのかよく分かりません。
Javaが得意だというなら、やりたい事をJavaのコードで書いてみて。
417デフォルトの名無しさん:2010/12/31(金) 08:48:34
彼にとってクラスとは「名前空間をきれいに整理する存在」程度のものなのだと思う
実は昔のBasicとかCOBOLあたりの経験があるんじゃないだろうか
Javaというキーワードが出てはいるが、
オブジェクト指向という言葉からはかなり遠いコードを書いているように思う
418デフォルトの名無しさん:2010/12/31(金) 10:16:53
> クラスとは「名前空間をきれいに整理する存在」程度のもの

実際そうじゃん^^
419デフォルトの名無しさん:2010/12/31(金) 10:19:05
>>413
まず「1つのクラスからはいくつもオブジェクトを生成できる」ということは解る?
組み込みのクラスで言えば、数値クラスとか文字列クラスとか、作れるオブジェクトが1つじゃ絶対困るよね。
そして、1つのクラス(仮にMyClassとしよう)から生成したオブジェクトがa,b,cと3つあるとする。

その際、a,b,cの間で異なる値を持つのがインスタンス変数。
逆に、クラス自体に値を持たせたい、同じクラスから生成したオブジェクト同士で共有させたい
という時に使うのがクラス変数。

たぶんこの使い分け自体はJavaでも同じだと思うから
使い慣れてるJavaで、もう一度OOPを勉強し直すと良いよ。
420デフォルトの名無しさん:2010/12/31(金) 10:25:22
JavaのOOは異端
421デフォルトの名無しさん:2010/12/31(金) 10:59:58
> 実際そうじゃん^^

馬鹿確定
422デフォルトの名無しさん:2010/12/31(金) 11:03:23
クラスインスタンス変数とクラス変数の違いを聞いているのになぜ
インスタンス変数とクラス変数の違いを答えるのか
423デフォルトの名無しさん:2010/12/31(金) 11:38:22
>>409の認識は正しい
>>411>>413は言いたいことが分からない
>>411>>419はクラスインスタンス変数を理解していないか存在自体知らないみたいなので虫でおk
424デフォルトの名無しさん:2010/12/31(金) 11:40:01
アンカー間違えた
>>409の認識は正しい
>>411>>413は言いたいことが分からない
>>410>>419はクラスインスタンス変数を理解していないか存在自体知らないみたいなので虫でおk
425デフォルトの名無しさん:2010/12/31(金) 11:48:21
>>422
すまん、本気で読み間違えたwww
426デフォルトの名無しさん:2010/12/31(金) 14:30:37
クラスインスタンス変数がインスタンス変数と何の違いも無く、ただのインスタンス変数であることを理解してない奴が多そうだ。
>>413の言うことは結構最もなことで、他言語の実装を理解してる人が初めて見れば相当キモイ。
変数宣言の要らない(できない)Rubyではクラス変数を実装するのが難しいからクラスインスタンス変数で誤魔化すしかない。

クラスも所詮ただのオブジェクトなので、クラスインスタンス変数を持った所で他のオブジェクトに影響を与えることは無い。
同じクラスオブジェクトに対するアクセサを各インスタンスが持っているだけ。

なので>>413に対する回答としては、
クラスインスタンス変数は確かに誤魔化しの機能だが、Rubyではそれしか方法が無いので仕方ない。
427デフォルトの名無しさん:2010/12/31(金) 18:21:44
クラスインスタンス変数の存在意義が分からないという>>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
>>427
1.9で直ったぞそれ
429デフォルトの名無しさん:2010/12/31(金) 19:19:53
>>428
検討中なんじゃなくて?おれの環境は1.9.2p0だよ
430デフォルトの名無しさん:2010/12/31(金) 23:45:35
>>407
該当コミットくれ
431デフォルトの名無しさん:2010/12/31(金) 23:58:54
>>407
それは助かるわ。1.9に移行する利用がまたひとつ増えた

コマンドプロンプトで 1.9.2-p0 mingw32
irb -U起動後、日本語含むファイル名があるディレクトリで
puts Dir["*"]で文字化けする

あれ?何が悪い?
432デフォルトの名無しさん:2011/01/01(土) 03:02:52
LANGが悪いんじゃね
433sage: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>'
434デフォルトの名無しさん:2011/01/01(土) 21:54:32
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

なんていう方法があるけど…いいと言えるかどうかは迷うところ。

436デフォルトの名無しさん:2011/01/01(土) 22:29:01
>>435
Procを使うのは思いつかなかった
caseに式がついてるほうが好みだからこれはありがたい
437デフォルトの名無しさん:2011/01/01(土) 23:27:25
lesser・・
438デフォルトの名無しさん:2011/01/02(日) 00:31:25
less than か。
439デフォルトの名無しさん:2011/01/02(日) 00:54:03
  (⌒)_(⌒)
  / ,  、ヽ
 ({{ o⌒o}})
  彡<_●_>ミ
  /   ヽ
  ||  ||
  U  U
  ノ| /ヽ|
 (_ノU U
440デフォルトの名無しさん:2011/01/02(日) 01:26:18
新年早々わらかすな
441デフォルトの名無しさん:2011/01/02(日) 07:40:52
サー・イレッサー!
442デフォルトの名無しさん:2011/01/02(日) 10:05:15
>>431
irb は -U オプションで default_external まで UTF-8 になるせいかな。
-Ecp932:utf-8 とかならいけるかも。
443デフォルトの名無しさん:2011/01/02(日) 13:32:03
MLって初心者でも参加して逐一見たほうがいいですか?
444デフォルトの名無しさん:2011/01/02(日) 13:37:38
仕事でRubyを使ってる人(要はそれで飯を食ってる人)は読んどいた方が良いかなぁと思うけど、
趣味でRubyを使ってる人や、仕事で自分のツールとしてRubyを使っている人はログを検索するだけで十分だと思う。
445デフォルトの名無しさん:2011/01/02(日) 18:42:15
東大生の俺はRubyのMLなんてレベル低すぎて読みたくない
446デフォルトの名無しさん:2011/01/02(日) 20:00:42
じゃあ発信する側に回れば
447デフォルトの名無しさん:2011/01/03(月) 00:23:25
クラスインスタンス変数って知らなかったのでググってみたのですが

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 からクラス変数は継承しないという仕様になったそうですが、そうなると
クラスインスタンス変数しか存在しなくなった(従来のサブクラスに継承されるクラス変数
はサポートされない)、ということ?
448デフォルトの名無しさん:2011/01/03(月) 04:09:14
>>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が同じテーブル名になってしまう。
449デフォルトの名無しさん:2011/01/03(月) 07:31:07
共有は悪、というのが俺のジャスティス。
クラス変数もクラスインスタンス変数も断じて使わん!
450デフォルトの名無しさん:2011/01/03(月) 08:40:03
rubyのプログラム中に他の言語を動かすことって出来るの?
451デフォルトの名無しさん:2011/01/03(月) 09:38:26
コードの一部を直接別文法で書きたいのか、
ライブラリを使えればいいのか、
外部プログラムとして実行できればいいのか。
452デフォルトの名無しさん:2011/01/03(月) 13:07:08
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するのもなんだかな、と思っています
453デフォルトの名無しさん:2011/01/03(月) 13:09:27
一行要約: Railsっぽいbool変数、属性の命名方法教えてください
454デフォルトの名無しさん:2011/01/03(月) 16:27:55
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 }
455デフォルトの名無しさん:2011/01/03(月) 17:03:32
Rubyでboolったら「?」だろうがよ

># boolを返すときはbbs.uses_proxy?のだとわかりやすいですが、
># attr_accessor, mattr_accessorのようなものを使う場合そこまでやってくれとはいえ
># uses_proxy?にaliasするのもなんだかな、と思っています
def use_proxy?
@use_proxy
end
でattrいらない。
456デフォルトの名無しさん:2011/01/03(月) 17:13:30
俺の会社では
「クラス変数は使用禁止」
だぞ。

理由は簡単で、クラス変数を利用しなければ不可能であるような実装はあり得ないからだ。
457デフォルトの名無しさん:2011/01/03(月) 17:21:52
あんまり了解性のある理由になってないな…w
じゃぁクラスも使用禁止だぞ。理由は簡単で(ry
458デフォルトの名無しさん:2011/01/03(月) 17:24:29
じゃあRuby使用禁止な。理由(ry
459デフォルトの名無しさん:2011/01/03(月) 17:25:34
Rubyのクラス変数は継承したクラスでもスコープが共有されるんで使いづらい
460デフォルトの名無しさん:2011/01/03(月) 17:26:27
「クラス変数を利用しなければ不可能であるような実装」は無いだろうけど「クラス変数を利用しなければ余計な手間がかかる実装」はあるんだけどなぁ…
各所に余計な手間をばら撒いてまでクラス変数を禁止するメリットはないよね
461デフォルトの名無しさん:2011/01/03(月) 17:27:34
>>459
初心者だから言ってみるんだけどさ、
スコープ共有としても、
触らなければ関係ないんじゃ?
462デフォルトの名無しさん:2011/01/03(月) 17:42:14
継承して使わせるようなクラスの場合、クラス変数は使わないほうが無難な気がしますわ。
463デフォルトの名無しさん:2011/01/03(月) 18:09:17
クラス変数の理想としては、
継承はされるがスコープは共有しない。

しかしRubyでは
@継承してスコープまで共有する
A継承すらしない
のどちらかの方法でしか実装できない。

っていう認識で合ってるのかな?
このジレンマの末、1.8では@を取り、1.9ではAを取る選択をしたということ?
なぜか1.9でも継承されてるみたいだけど。
464デフォルトの名無しさん:2011/01/03(月) 23:51:10
>>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でいいたくて
465455:2011/01/04(火) 00:34:03
>>464
ごめん。
実は俺自身も初心者に産毛が生えた程度だからあまり偉そうに言えなかったりする。
でもRubyらしくってことならやっぱりboolはクエスチョンマークの付いたメソッドで得るものだと思う。
んで、セッタのメソッドを作るんじゃなくて、
def use_proxy
 @use_proxy = true
end
def unuse_proxy
 @use_proxy = false
end
みたいにする。
変数とメソッドの名前を今までの話を引き継いだものにしたから、このままじゃちょっと違和感あるけど。
attr_は極力使わないほうがいいはず。
466デフォルトの名無しさん:2011/01/04(火) 08:57:38
どうでもいいかもしれないけど、proxy_used?のほうが好きかな
467デフォルトの名無しさん:2011/01/04(火) 12:39:49
こちらでいいか分かりませんが、教えてください。

1.9から、sprintfフォーマットで、
'%{a},%<a>4s' % {a: 'b'} # => "b, b"
のようなことが出来るようになったみたいですが、ドキュメントに記載が無いようです。
これは、単なるドキュメントの記載漏れなのでしょうか?
それとも、まだ仕様が確定していなくて、使わない方がいい状況とかいうことなのでしょうか?

ちなみに、MLの議論は以下で行われたっぽいです。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/35851
468デフォルトの名無しさん:2011/01/04(火) 12:45:44
>>467
sprintf.c のrdocコメントに記載がある。
469デフォルトの名無しさん:2011/01/04(火) 13:09:35
>>468
すばやいレスありがとう!
確かにありますね。
これで、心置きなく使えます。
470デフォルトの名無しさん:2011/01/04(火) 16:57:57
attr_* は初心者的実効性に疑問符がついてると思う
何が悲しくて内部変数名と同名のメソッドを定義強制されなければならんのかと小一時間

確かにラクなのだが、他人様の前に出すようなクラスなのなら
使用する前にちょっと考えてみたほうがいいかも
471デフォルトの名無しさん:2011/01/04(火) 17:16:50
話が逆だろ?

インスタンス変数と、読み書き以外何もしないセッタ・ゲッタを、ひととおり定義したい、
という時に、DRY的な理由から使うのがattr_*だと思う。初心者だろうが熟練者だろうが。

他人様の前に出すようなクラスなら、より抽象的にわかりやすくなるのだから、
積極的に使うべき。
472デフォルトの名無しさん:2011/01/04(火) 17:18:36
attr_*を使わずどうするのか書いてないから何とも言えないな
>>470は具体的にどうすればいいと思ってるんだよ
473デフォルトの名無しさん:2011/01/04(火) 17:31:52
>>471
本当にattr_を使わなければならないのかどうか考えろってことだろ
DRYもいいがカプセル化も重要

>>472
俺470じゃないけど>>465みたいなのじゃないかな?
少なくともインスタンス変数を外から直接操作できるなんて可能な限り避けるべき
474デフォルトの名無しさん:2011/01/04(火) 18:01:13
悲しいならattr_*を使わなければいいだけの話だろ
自分で勝手に宣言しておいて「強制」とか訳わからん
475デフォルトの名無しさん:2011/01/04(火) 18:06:50
attr_*を使うべきじゃないってのは
>インスタンス変数と、読み書き以外何もしないセッタ・ゲッタを、ひととおり定義したい、
というのがそもそもよくないと言っているのか
476デフォルトの名無しさん:2011/01/04(火) 18:12:28
attr_がセッタ・ゲッタという認識なら改めたほうがいいと思う。
じゃあなんなん?と問われると今はちょっとそんな元気は無いので元気なかたに譲る。
477デフォルトの名無しさん:2011/01/04(火) 18:15:02
「名前重要」とかいう割に、
インスタンス変数とメソッド名に共通の名前などという都合のよい果実を求めさせるスタンスがよくない

…ような気はする
attr_ で定義されたメソッドは、なんというか
中の人の都合の内部構造に思いッきり引っ張られてて、一般ユーザー視点ではわかりにくいことがなくもない
proxy_addr= で @proxy_addr を設定するのではなく
set_proxy(addr, host=nil) で @proxy_addr と @proxy_host を設定するほうがフレンドリーじゃね、みたいな感じ
478デフォルトの名無しさん:2011/01/04(火) 18:22:11
最近はセッターなんて定義せずにHashでパラメータ与えるほうが多い気がする。
479デフォルトの名無しさん:2011/01/04(火) 18:23:27
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って感じではあるが



こういう感じのことかな?
480デフォルトの名無しさん:2011/01/04(火) 18:24:23
>>474
attr_* が無為にガンガン使われまくってる現状を憂いてるのかもしれん
「インスタンス変数の操作はattr_系を使うほうがよい」みたいな思い込みみたいな
rdocがattr_を特別扱いしないだけで状況はかなり変わると思うんだがな
481デフォルトの名無しさん:2011/01/04(火) 18:28:38
proxy_addr と proxy_host ってひょっとして被ってね addr_port とかじゃねこれうんすまん>>477ミスった

>>479
あーそんなん
インスタンス変数名とメソッド名称をがっちり結び付けてるのが、なんかヤ
それが当たり前のように初心者に浸透してる感じなのが、更にイヤ
そういう attr_ で提供された微妙な名称のメソッドを使わざるを得ないときとか、もにょんする
482デフォルトの名無しさん:2011/01/04(火) 18:33:46
アクセサメソッドってものがそもそも泥臭いというか

def flag
 @flag
end
def flag=(val)
 @flag = val
end

じゃなくて

def use
@flag = true
end
def release
 @flag =false
end
def used?
 @flag
end

にしようよっていうような。
483デフォルトの名無しさん:2011/01/04(火) 19:18:25
たとえば、

class Point
 attr_accessor :x, :y
end

こういう場合に使うものだと思うけど。
484デフォルトの名無しさん:2011/01/04(火) 19:55:35
>>479
目から鱗だな。確かに複数のsetterが関数で存在する必然性はない気がする。
これは面白い。
485デフォルトの名無しさん:2011/01/04(火) 20:55:24
>>484
そうかえ?
486デフォルトの名無しさん:2011/01/04(火) 21:01:46
なんか大昔のめんどくさいOOP議論を思い出すな
487Perl忍者 ◆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

488デフォルトの名無しさん:2011/01/04(火) 22:26:01
Rubyを使う以上は「Rubyらしく」と「オブジェクト指向らしく」はなるべく守るべきだと初心者なりに思う
489Perl忍者 ◆M5ZWRnXOj6 :2011/01/04(火) 22:47:52
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)

なに?wブロガーとかがOOPとかについてわめいてるから?wオブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)
オブジェクト指向つかわなくてもかけるじゃん(笑)

なに?wブロガーとかがOOPとかについてわめいてるから?w
490デフォルトの名無しさん:2011/01/05(水) 01:11:17
raiseして放置するとスタックトレースの表示がだらだら出るじゃないですか。
あれを

begin
 raise
rescue => e
 p e # ここで表示させるにはどうすればいいですか?e.backtraceは寂しすぎる。
end
491デフォルトの名無しさん:2011/01/05(水) 01:43:45
callerかな
492デフォルトの名無しさん:2011/01/05(水) 15:11:46
eclipseでpを日本語で使うとコンソールに文字コードで表示されちゃわない?
putsなら問題ないんだけどな・・・
493デフォルトの名無しさん:2011/01/05(水) 18:50:54
関数的メソッド p が利用する String#inspect は、本当はニホンゴ文字として表示したがっているのだ
ユーザーの環境でニホンゴ文字が利用可能かの判断は、$KCODE の設定の有無を見てる
$KCODE が "NONE" であるなら、文字列を \123 等のバイト列表示に変換して標準出力に流す

てことで、適宜 $stderr.puts str.tosjis とかするか、$KCODE="s" した上で p str するかしれ
個人的には p でニホンゴ文字が表示されてしまうのは好きではない

設定の有無だけじゃなくて内容も見て自動で変換とかやって欲しくね、というのをやってるのが Ruby1.9.x
494デフォルトの名無しさん:2011/01/05(水) 20:25:54
>>493
なるほどサンキュー
495Perl忍者 ◇M5ZWRnXOj6:2011/01/05(水) 22:25:26
Rubyとかww
Perl最強だぜ!
496Yappo:2011/01/06(木) 17:45:10
Perlだけしか使えないやつはばかやで
PHPも使えるけどな
497まつもとひろゆき:2011/01/06(木) 17:55:57
これはこれは やっぽさん恐れ入りますわー
498まっつ:2011/01/06(木) 18:16:05
せやなー
499デフォルトの名無しさん:2011/01/06(木) 18:32:31
Ruby 1.8.7 でメソッドの返りで return を使うと、
return を省略した場合に比べて遅いんだけど、そういうもんなのかな?
1.9 系ではほとんど変わらないみたいだけど。
500nihen:2011/01/06(木) 20:21:12
フンガ?
501デフォルトの名無しさん:2011/01/06(木) 21:39:26
>>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
初心者はまず最初に何を作ればいいの?
504デフォルトの名無しさん:2011/01/07(金) 00:13:38
俺はテキストフィルタだったな
Windowsのコマンドプロンプトは、標準だとテキスト処理のコマンド足りなさ過ぎだから
他の言語とかでコマンドプロンプト使う機会が多かった俺にはなかなか役に立った
505デフォルトの名無しさん:2011/01/07(金) 00:37:36
今必要なものを作ればいい
なければこれまでに必要になったものをもう一回Rubyで書いてみるとか
506デフォルトの名無しさん:2011/01/07(金) 01:08:28
テキストフィルターの作り方

0. 準備
パスの通っている場所を確保する
-S で起動できるかテスト
または *.rb に関連付けて、スクリプトファイルだけで実行できるようにする。

1. 第一段階
# オプションの -p や -n は使わない。
ARGF.each{ |line|
# ここに何か書く

print line
}

2. 第二段階
optparse または、getoptlong を使ってオプションを取り扱う

3. 第三段階
関数・メソッドを書いて、見通しを良くする
507デフォルトの名無しさん:2011/01/07(金) 07:10:00
>>503
メソッドの説明とかある程度見聞きしてサンプル写経してなお、
特に作りたいものも作れそうなものも思いつかないなら、
とりあえず一旦Rubyを置いて街に出て別なことやれ

必要になったらたぶんまたRubyに帰ってくるからさ
プログラミングなんて無理してやるようなもんでもねえよ
508デフォルトの名無しさん:2011/01/07(金) 07:53:15
>>496
Perl忍者やめろ
509デフォルトの名無しさん:2011/01/07(金) 08:54:49
おまえらホント暇そうだな
510デフォルトの名無しさん:2011/01/07(金) 16:32:36
unable to convert U+201D from UTF-8 to US-ASCII for lib/rdoc/text.rb

gem update したらエラーが出るよ〜
511デフォルトの名無しさん:2011/01/09(日) 16:57:18
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しないので化けない。
514デフォルトの名無しさん:2011/01/09(日) 17:46:52
>=> "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は設定されてるのか。
516デフォルトの名無しさん:2011/01/09(日) 18:03:08
rubyopt=-Ks 〜〜
と環境変数を設定してあるので

>> $KCODE
=> "SJIS"

になってます。
517デフォルトの名無しさん:2011/01/09(日) 18:23:29
>>514
> 変えてみたところ症状は変わらず
いや変わっとるがな
String#inspect で最後の文字がバイト表現になるのはバグで、p330 で修正済み

irb において、バックスペースで Unicode の曖昧幅の記号文字を消すとその後のカーソル位置が不良になるのは
readline かターミナルエミュレータか何かが原因だろう
518デフォルトの名無しさん:2011/01/09(日) 18:35:22
・ 純粋なコマンドプロンプト上の話ではない
・ マルチバイト非対応のreadline.dllをパスのどっかで読み込んでいる
・ 誰も試してなかったが、半月前に出た 1.8.7-p330 の mswin32 の Readline が実は変

どれかなんじゃないかな
519デフォルトの名無しさん:2011/01/09(日) 18:47:06
案外3番目のような悪寒
520デフォルトの名無しさん:2011/01/09(日) 22:56:06
RubyInstallerか何かに添付配布されているrbreadlineじゃないよな

いやあれはそもそも不安定すぎて入力したらよく落ちるが
521デフォルトの名無しさん:2011/01/10(月) 00:24:32
アップデートしようとしてp330のzipをダウンロードしたのですが、展開したら中身がやけにいっぱいあってびっくりしてます。
今はp302で、Ruby187フォルダの中には「bin」「doc」「lib」「share」フォルダとアンインストーラしか入っていません。
失敗が怖くてまだ何もしていない状態なんですが、これはp330の中身を丸ごとコピーするというのとは違いますよね?
ここからどうすればいいんでしょうか?
522デフォルトの名無しさん:2011/01/10(月) 01:14:12
ActiveScriptRubyの拡張子がmsiのやつでインストールすれば?
523デフォルトの名無しさん:2011/01/10(月) 01:25:53
>>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]
525デフォルトの名無しさん:2011/01/10(月) 09:14:12
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 に変換するのめんどい

自力で好みのテーブルを作って置換するのがいちばんだと思う
526デフォルトの名無しさん:2011/01/10(月) 09:19:21
ああ、なんかもう当たり前のように化けてるな

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も使ったことないので
これを機に試してみます。ついでに逃げてきた文字コードの
勉強することにします。ありがとう
529デフォルトの名無しさん:2011/01/10(月) 09:50:44
Rubyでは関数に引数を渡すと、参照渡しになるのでしょうか。
たとえば関数の引数に配列を渡し、関数内でその配列を操作すると、もとの配列が変更されてしまいます。

def f(arg)
 arg << "x"
end
arr = ["a", "b"]
f(arr)
p arr #=> ["a", "b", "x"]

これがPHPなら、argを変更してもarrは変更されないのですが、Rubyは違うようです。
つまり、Rubyは参照渡しだということなんだと思いますが、あってますでしょうか。

530デフォルトの名無しさん:2011/01/10(月) 10:08:38
>>528
require "rubygems"
require "babosa"
p " ".to_slug.approximate_ascii.to_s #=> "aeiou"

でよくね?
531デフォルトの名無しさん:2011/01/10(月) 10:10:49
>>529
あってる
532デフォルトの名無しさん:2011/01/10(月) 10:13:29
>>530

babosaってなんじゃらほい、と思ってググったが、URLのslugを作るライブラリか。
533デフォルトの名無しさん:2011/01/10(月) 10:40:05
すらぐってなんすかね

…はあ、ページが提案する(またはページタイトル等から生成される)、
動的または投稿で作られたページの固定URLを表現する際に使ってもよい文字列
このスレをミラーするページのURLがttp://example.com/2chview/Ruby-Part-40になるみたいなもんか

アスキー文字っぽいものはURLとして読みやすいアスキー文字に揃えてしまうという機能がついてるのね
534デフォルトの名無しさん:2011/01/10(月) 10:47:27
>>529
実のところ「参照渡し」ではない
参照渡しだとして理解すると本当は危険
というか参照渡しとはなんぞやという面倒な話に
535デフォルトの名無しさん:2011/01/10(月) 10:49:50
「オブジェクトそのものを渡しているわけではありません」という慎重な表現が
536デフォルトの名無しさん:2011/01/10(月) 10:53:52
>>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の変数は「ラベル」として考えるもので、メソッドの引数は「ラベルの値渡し」をしている。「オブジェクトの値渡し」ではなく。
とりあえずググればいろいろ出てくるよ。
537デフォルトの名無しさん:2011/01/10(月) 13:37:36
いろいろ出てくるがかなりの確率で、内容がハズレだ
538デフォルトの名無しさん:2011/01/10(月) 13:44:20
過去スレで書かれたもののほうが短さと適切さのバランスが取れてる気がする
539デフォルトの名無しさん:2011/01/10(月) 13:57:53
そこら辺はJavaと全く同じだからJava経験者なら分かりやすいだろう
540デフォルトの名無しさん:2011/01/10(月) 16:34:15
関係ないんだけど配列の値渡しってどんな実装?
541デフォルトの名無しさん:2011/01/10(月) 17:22:45
PHPみたいに配列の中身がごそっとコピーされるようなものを期待しているとしたら、
自分でそのように書かない限り、Rubyにそのようなものはないぞ。
542デフォルトの名無しさん:2011/01/10(月) 17:42:26
すごいよMarshalさん
543デフォルトの名無しさん:2011/01/10(月) 18:41:57
そうそう、Marshal 経由でコピーがあったね。
544デフォルトの名無しさん:2011/01/10(月) 20:46:00
NokogiriでHTMLをパースしたいのですが、
 のようなエスケープ文字が勝手にアンエスケープされてしまい、困っています。

html = Nokogiri(<html><body>こんにちは テストです。</body></html>)
text = html.search('body').first

textの中身は以下のようになってしまいます。
<body>こんにちは テストです。</body>

 のようなエスケープ文字をそのまま保持させる方法はないでしょうか。
545デフォルトの名無しさん:2011/01/10(月) 20:50:42
↑すいません、訳分からない文になってしまいました。
再投稿します。


NokogiriでHTMLをパースしたいのですが、
&nbsp;のようなエスケープ文字が勝手にアンエスケープされてしまい、困っています。

html = Nokogiri(<html><body>こんにちは&nbsp;テストです。</body></html>)
text = html.search('body').first

textの中身は以下のようになってしまいます。
<body>こんにちは テストです。</body>

&nbsp;のようなエスケープ文字をそのまま保持させる方法はないでしょうか。
546デフォルトの名無しさん:2011/01/10(月) 21:11:49
HTMLにエスケープ文字はない

はともかく、実体参照の解決はlibxmlが制御できんとこで自動でやってるので制御できん
ナマのHTMLを取得する手段はないと思ってくれていい
547545:2011/01/10(月) 21:24:23
>>546
おおおそうだったのか。。
よく分かりました。貴重な情報ありがとうございました。
548デフォルトの名無しさん:2011/01/10(月) 22:25:00
そういうときはhpricot使ってる
549デフォルトの名無しさん:2011/01/11(火) 00:00:25
Rubyの引数は値渡しだという話題これで何度目だよw

>>529
参照渡しにはならないよ。値渡しだよ。あえていうなら「参照の」値渡しだよ。

そもそもPHPもデフォルトはメソッドの引数も値渡しのようだが
PHP: 関数の引数 - Manual - http://php.net/ http://php.net/manual/ja/functions.arguments.php

代入の話かと思ったが代入演算子もオブジェクトの場合は参照がコピーされるようだぞ
PHP: 代入演算子 - Manual - http://www.php.net/ http://www.php.net/manual/ja/language.operators.assignment.php

>>531
まーたデタラメを広めるなw
550デフォルトの名無しさん:2011/01/11(火) 00:01:23
URLコピペミスした。気にしないで。
551デフォルトの名無しさん:2011/01/11(火) 00:31:00
>>549
初心者スレだからしょうがない面はあるだろ

>>531はなにゆえ断言したのか…
552デフォルトの名無しさん:2011/01/11(火) 06:12:37
オブジェクトの内容を参照するための情報を引数として渡しているのは間違いがない
ただ、それは「参照渡し」とは違う
553デフォルトの名無しさん:2011/01/11(火) 06:36:01
参照渡しはC言語にしか存在しないのでC言語以外でこの言葉を使用するのを禁止するって法律に書いとけ
554デフォルトの名無しさん:2011/01/11(火) 07:15:52
>>553
C 言語には「存在しない」が。全部値渡しだぞ、あれ。渡してる値が整数だったりポインタだったりするだけだ。
C++ や Pascal には参照渡しがある。
555デフォルトの名無しさん:2011/01/11(火) 07:29:37
というか参照渡しとはなんぞやという面倒な話に

ある言語の概念を他の言語に無理矢理適用しようとするのやめようぜ
556デフォルトの名無しさん:2011/01/11(火) 07:39:52
やっぱり紐だよ紐。
変数は荷札。引数は荷札と紐を渡す。
557デフォルトの名無しさん:2011/01/11(火) 07:47:14
ユビキタスシステムが普及して万引きが減ると良いね
558デフォルトの名無しさん:2011/01/11(火) 09:19:51
やたー
名前渡しできたよー

def namae(arg)
  eval "#{arg} = 999"
end

$hensu = 1
namae :$hensu
p $hensu #=> 999
559デフォルトの名無しさん:2011/01/11(火) 10:12:05
Cのポインタ渡しは参照渡しだろうという説はある
Cには参照渡しが「ないからこそ」、Cでのポインタ渡しは
ポインタ以外を渡す行為と対称して参照渡しと呼ばれるのだな

Cだけの世界では、>552的な意味で間違ってはいない

まあ、汎用な計算機科学っぽい事象かと思ったら
特定の言語実装べったりのローカル概念でしたというのは
稀によくある
560デフォルトの名無しさん:2011/01/11(火) 10:31:15
単に誤用してるだけだな。
たまに俺の用法で辞書書き換えろとか言い出す困ったちゃんもいるが。
561デフォルトの名無しさん:2011/01/11(火) 11:13:22
> Cには参照渡しが「ないからこそ」、Cでのポインタ渡しは
> ポインタ以外を渡す行為と対称して参照渡しと呼ばれるのだな

呼ぶな。

C++ には本物の参照渡しがあるし、早速混乱するぞ。
562デフォルトの名無しさん:2011/01/11(火) 11:18:39
Cしかやらないのなら問題はないし、Cで終わる人も多かろう

というか値渡しだって「値を渡してるから略して値渡しなんだよね」と認識してる人が大多数だろう
「ポインタという名前の参照用情報を渡してるから略して参照渡しと呼ぶね」と認識することを責めることはできん
563デフォルトの名無しさん:2011/01/11(火) 11:26:34
C++もやる人と同じプロジェクトに放り込まれて混乱するわけですな。
564デフォルトの名無しさん:2011/01/11(火) 11:26:43
めんどくせえ…

 ・ 不用意に略語にするな
 ・ あなたのプログラミング上の造語はほぼ確実にどっかの専門用語だ
 ・ 正しい語を使って話せ

でいすか
565デフォルトの名無しさん:2011/01/11(火) 11:28:42
お前ら一体何十回同じ話ししてんのかと
技術解説+理解を促進させるサンプルがあれば
不正確な比喩表現なんて必要ない
566デフォルトの名無しさん:2011/01/11(火) 11:34:37
>>565
説明表現を考えているわけではない

「それは〜〜が〜〜で〜〜〜なわけだ」
「なるほど○○なんですね」 ← これ
「いや違う」

をなんとかしようなんとかできんなという話だ
567デフォルトの名無しさん:2011/01/11(火) 11:37:37
>>566
いや違う〜は〜って意味だから覚えてね、でOKじゃん。
568デフォルトの名無しさん:2011/01/11(火) 11:38:11
読むだけ時間の無駄。
569デフォルトの名無しさん:2011/01/11(火) 11:43:20
基本、Cしか知らない人はRubyしか知らない人並みに害悪を撒き散らす
適当な壷の中にでも封印しておくのがよい
570デフォルトの名無しさん:2011/01/11(火) 21:43:01
>>556
紐ってどういう例え?
571デフォルトの名無しさん:2011/01/11(火) 21:45:22
その話もう終わってるから
572デフォルトの名無しさん:2011/01/11(火) 21:51:56
何らかのクラスやモジュールの定義をスクリプトとして視覚化というか文字列化というか、可能?
ぶっちゃけツクールの組み込みクラスなんだけども、どう定義されてるか見てみたいんだ。
573デフォルトの名無しさん:2011/01/11(火) 22:19:24
どのツクールだよ
574デフォルトの名無しさん:2011/01/11(火) 22:21:02
XPのInputとかWindowとかが見たい
できたらいいなとは思うんだけどやっぱり無理かな
575デフォルトの名無しさん:2011/01/11(火) 22:37:32
> InputとかWindow

rubyにそんな機能はないです
576デフォルトの名無しさん:2011/01/11(火) 23:10:38
「ツクールの組み込みクラス」って書いてあるのにその突っ込みはないわー
577デフォルトの名無しさん:2011/01/11(火) 23:42:04
>>574
詳しく知らんがRPGツクールだろ

>>574
ソースを見たいということならば、そのInputやWindowがネイティブコンパイルされた拡張ライブラリでないなら
中身を見られるかもね

でも確かファイルやライブラリは暗号化されていたはずだから、なんらかの方法で復号化のメソッドを探せばいんじゃないかな
ただ拡張ライブラリ内で復号化してそのまま読み込まれていたら面倒だな
578デフォルトの名無しさん:2011/01/12(水) 07:44:07
>>577
今の自分にはハードルが高いということは分かった。ありがとう。
もう少し調べてみる。
579デフォルトの名無しさん:2011/01/12(水) 08:38:48
>>578
open('./rpg.rb', 'w'){|f|
ObjectSpace.each_object(String){|x|
f.write x if x.include?('module RPG')
}
}
580デフォルトの名無しさん:2011/01/12(水) 17:20:21
>>579
ありがとう。どこに置けばいい?
イベントコマンドでもスクリプトエディタの何もないところでも「module RPG」がずらっと出力されるだけだった。
ちなみにif以降を消して実行してみたらRPG::Mapとかは取り出せたけどInputやWindowは出なかった。
バイナリファイルを開いた時のようなごちゃごちゃした部分がかなりあったんだけど、つまり>>577の言った通りネイティブコンパイルされてて取り出せないということだろうか
581デフォルトの名無しさん:2011/01/12(水) 17:59:17
>>579
'module RPG' みたいな文字列リテラルはブロックの外に出さないと
ブロック評価するたびに文字列オブジェクト生成されるから
「module RPG」が無駄にずらっと出力されてしまうと思われ。
582デフォルトの名無しさん:2011/01/13(木) 19:20:12
以前このスレだか過去スレだかでWindowsでテキストファイル読み込む時は
バイナリモードで読んでからforce_encodingすると速いと書いてあったんでやってみた。
爆速じゃねーか
内部で自動的にやってることをスクリプトに書き出しただけなのになんでこれほど違うんだろう?
583デフォルトの名無しさん:2011/01/13(木) 20:34:59
Windowsのテキストモードでは
\r\n \n \r のどれでも改行だと認識するためのUniversalNewline
とか言う処理が入っていて遅いと聞いた

ワンライナーや自作テキストフィルタで1.8だと 1秒未満のやつが
1.9だと2〜3秒かかって、イラッと来るときがある
ブロックデバイスからのファイル読み込みに限って、高速なルーチンに切り替えるとかできないものだろうか
584デフォルトの名無しさん:2011/01/13(木) 21:29:14
逆に言うとWindows以外やWindowsのバイナリモードだとその処理が入ってないって事か?
Windows上で作成した\r\n改行のテキストファイルをLinux上で読むと結果が異なってくる?
585デフォルトの名無しさん:2011/01/13(木) 23:12:08
日本語でおk
586デフォルトの名無しさん:2011/01/14(金) 03:22:51
>>585
馬鹿には無理
587デフォルトの名無しさん:2011/01/14(金) 03:43:23
>>584
改行処理なんてやってるのはメジャーどころじゃWindowsぐらいじゃないかな
もしかしたらMacOSもやってたかも知れないが(今はUnix系なので多分やってない)

ShiftJIS + \r\nなら、Linux上でも最近のエディタなら流石に読めるよ
中途半端にEUC + \r\nとかやられたら流石に分からんかも知れんがw
588デフォルトの名無しさん:2011/01/14(金) 07:41:38
いやエディタはどうでもよくて、RubyでShitJIS+\r\nのファイルを読んだときどうかという意味です。
もちろんエンコーディング指定は適切にしたとして、$がどこにマッチするかとか振舞いに違いがあるのかどうか
589デフォルトの名無しさん:2011/01/14(金) 07:50:09
>>585
分かりにくくてすみません
590デフォルトの名無しさん:2011/01/14(金) 08:01:26
>>588
やってから言えば?
591デフォルトの名無しさん:2011/01/14(金) 09:30:57
force_encoding は中身に手をつけないだろ。
爆速に決まってるじゃねーか。エンコーディングのラベルをはりかえる以外なにもしないんだから。
592デフォルトの名無しさん:2011/01/14(金) 18:21:57
>>590
最近はソフトとか勝手に入れられなくてね

>>591
そういうからくりでしたか。納得です。
593デフォルトの名無しさん:2011/01/14(金) 18:28:36
会社のPCで環境作れないなら
そのくらい家でやればいいだろw
594デフォルトの名無しさん:2011/01/14(金) 19:21:48
まったくです。
595デフォルトの名無しさん:2011/01/15(土) 13:46:21
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
597デフォルトの名無しさん:2011/01/15(土) 16:29:34
ruby1.9-devの依存先をたどれば良いジャマイカ。
598デフォルトの名無しさん:2011/01/15(土) 16:30:42
>>595
↓実行すればバイナリ作るのに必要なもの全部入るよ
1.9.1だけどあんまり変わらなんじゃないかな
sudo apt-get build-dep ruby1.9.1-full
599デフォルトの名無しさん:2011/01/15(土) 17:00:52
ライブラリじゃないけどruby1.8とbison(とtrunkならautoconf)はうっかり入れ忘れることがある
ビルド失敗ですぐ気付くからいいけど
600デフォルトの名無しさん:2011/01/15(土) 17:02:25
tarballからのビルドならrubyとbisonはいらないハズ。
リポジトリからだと必要だけど。
601デフォルトの名無しさん:2011/01/15(土) 23:44:14
>>584-587
Windowsで改行処理してLinuxでしてないってこと?
今の時代むしろナンセンスに感じるんだけど
もうFTPで転送時に改行コードや文字コード置き換える時代じゃないし

それだとWindowsで読めていたテキストが、Linuxで改行増えているようなことになるのかな?
Windowsで編集して、Linuxで処理するようなこともよくやっていて気になった
602デフォルトの名無しさん:2011/01/16(日) 00:47:57
旧Mac(\r) ユーザーのホームページで、変な改行になっているのは、かなり見たことある。
HTML のソースを良く見た頃の話だけど、Mac ユーザーの HTML は一部が壊れていた。
あと Mac は、ファイルの先頭にプロパティがあったじゃん。
あれも、変なデータをうpする原因になっていたんだろうなと思った。
603デフォルトの名無しさん:2011/01/16(日) 02:21:43
\rを何だと思ってるんだ
604デフォルトの名無しさん:2011/01/16(日) 02:23:39
MacBinaryは良いアイディアだと思うけどなぁ
BOMいらなくなるじゃん?
605デフォルトの名無しさん:2011/01/16(日) 07:38:12
自分のPCでソースを普通に見れないと「壊れている」ってか?
606デフォルトの名無しさん:2011/01/16(日) 15:25:30
1.8系でUTF-8のファイルパスを使用する方法があったら教えてください
openやFile.exist?の引数としてUFT-8のファイルパスを指定したいです

というか、wxRubyがUFT-8前提なのでUTF-8が通らないと日本語パスが使えない・・・(´・ω・`)
607デフォルトの名無しさん:2011/01/16(日) 20:49:47
>>606
wxRubyがどうのよりも1.8系はUTF-8を扱えてもmswin32やmingw32はUNICODEのファイルパスにそもそも対応していないのでは

Cygwinを使うのも手だけどwxRubyが問題か
608デフォルトの名無しさん:2011/01/16(日) 22:50:07
後発のスクリプト言語のくせに C みてぇだな。
609606:2011/01/16(日) 23:06:45
>>607
レスありがとう
Cygwinはライセンス的に使えるライブラリが限られてしまうので避けたいです
1.9.2@mswin32でUFT-8のファイルパスが扱えることは確認しました
・・・が、今度は1.8.7で動いていたwxRuby関係のコードが動かない罠
こりゃ詰んだか・・・il||li ○| ̄|_
610デフォルトの名無しさん:2011/01/17(月) 00:24:57
Class.superclass
=> Module
Module.class
=> Class

どういうことなの。。
611デフォルトの名無しさん:2011/01/17(月) 02:49:33
>>610
それはどういうことが分からないんだ?

・回答A
ClassはModuleを継承している。
でもModuleもClassのインスタンスであり、すべての親であるObjectだってClassのインスタンス。
こういった基本的なクラスは相互に依存し合っていて、どこかが欠けると成立しない。
卵が先でも鶏が先でもない。両方あるからこそ成り立つ。
だからこそ、言語本体に組み込まれて存在している。


・回答B
後者の式は「Moduleクラス」や「Classクラス」のクラスを得る式。
クラスのクラスを得るのだから、当然返ってくるのはClassに決まっている。
Moduleクラスそのものを得たいなら

Module.class

なんて書くのは完全に蛇足で、単に

Module

と書く。
612デフォルトの名無しさん:2011/01/17(月) 06:55:42
>>610
どういうことって言われても。。
>Class.superclass
>=> Module
Classの親クラスはModuleってだけのこと。

>Module.class
>=> Class
ModuleはClassクラスのインスタンスオブジェクトだってだけのこと。
ModuleもClassもStringもObjectも、Classクラスのインスタンスオブジェクト。

613デフォルトの名無しさん:2011/01/17(月) 09:36:38
そんな偉っそうに書いてて恥かしくないの?
614デフォルトの名無しさん:2011/01/17(月) 09:52:34
なに意味のわかんないこと言ってるんだ>>613
615デフォルトの名無しさん:2011/01/17(月) 09:56:35
pgr
616デフォルトの名無しさん:2011/01/17(月) 13:33:29
>>612
そんなのわかってんだろうけど、
つながりとして考えたとき驚いたってことだろ。
得意になって断片的な説明して笑えるw
617デフォルトの名無しさん:2011/01/17(月) 14:45:56
一人で笑ってれば?
618デフォルトの名無しさん:2011/01/17(月) 14:51:54
おれも笑った
619デフォルトの名無しさん:2011/01/17(月) 15:59:44
>>610 がどういう挙動を想定してそれがどう違って驚いたのか具体的に書かないと、
結局断片的な説明しかできないじゃん。
それを得意になって笑えるとか、そんなん悪趣味な釣りとしか思えんよ。
620デフォルトの名無しさん:2011/01/17(月) 16:13:48
いやー、笑った笑った
621デフォルトの名無しさん:2011/01/17(月) 16:16:44
自分以外みんなわかってるなら、それは自分がおかしいのだ

そう考えるようにした方がいい。まだ間に合う
622デフォルトの名無しさん:2011/01/17(月) 18:12:14
わらうなら612じゃなくて>>611だろ。
>>611
>Moduleクラスそのものを得たいなら
>
>Module.class
>
>なんて書くのは完全に蛇足で、単に
>
>Module
>
>と書く。

Module.class で返されるのは Class であって Module ではない。
623デフォルトの名無しさん:2011/01/17(月) 18:31:10
>>622
>>611 の指摘はそれほど外してない気がする。
>>610 は Ruby のクラス階層の is-a has-a の構造で混乱しているんじゃないかな。
624デフォルトの名無しさん:2011/01/17(月) 18:35:44
そんなhas-aないだろう
625デフォルトの名無しさん:2011/01/17(月) 20:06:37
>>623
>>>610 は Ruby のクラス階層の is-a has-a の構造で混乱しているんじゃないかな。

混乱しているのはおまえのほう。has-a関係ない。

>>624
誰も気づいてないようだからつっこんでやるけど、だれがうまいこといえと
626デフォルトの名無しさん:2011/01/17(月) 20:57:22
class は Object のメソッド
superclass は Class のメソッド
並べると確かに変だな。
627610:2011/01/18(火) 02:56:26
中途半端なレスしてすいませんでした。
意図していたことは>>611さんの回答Aで言っていることそのままでした。

Class.superclass
=> Module
ClassはModuleの性質を受け継いでいるのに

Module.class
=> Class
Moduleの元になるクラスはClassである。


という関係が直感的に意味不だったので。。
628デフォルトの名無しさん:2011/01/18(火) 08:16:30
クラス⇔インスタンス
Class⇔Module

サブクラス⇔スーパークラス
Module⇔Class


別の概念である。同じ「class」という単語が使われているが間違えないように。
629デフォルトの名無しさん:2011/01/18(火) 14:28:00
>>609
リリース時に処理系の環境がGPLなのは不可な案件か?
RubyGemsでもGPLなものもあるから気を付けろよ

それはそうとissueはこのあたりと関連チケットだな
1.8にポーティングは可能なのだろうか
その前にwin32は人が足りていないような気もするし

Ruby 1.9 - Bug #1685: Some windows unicode path issues remain - Ruby Issue Tracking System
http://redmine.ruby-lang.org/issues/show/1685
Ruby 1.9 - Bug #1771: system()/popen()/popen3() & windows & unicode is not working - Ruby Issue Tracking System
http://redmine.ruby-lang.org/issues/show/1771
630tom:2011/01/18(火) 15:16:12
req = Net::HTTP::Post.new(url.path)
req.set_form_data("aaa=bbb&ccc=ddd")
としてば場合、&、=をurlエンコードしない方法ってありますか?
631デフォルトの名無しさん:2011/01/18(火) 19:23:17
>>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'
632デフォルトの名無しさん:2011/01/19(水) 21:07:11
お前らrvmアップデートしとけよ
JVN#30414126: Ruby Version Manager におけるエスケープシーケンスインジェクションの脆弱性
http://jvn.jp/jp/JVN30414126/
633デフォルトの名無しさん:2011/01/20(木) 05:05:22
力を貸して下さい。
まず、
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)]
とか出来たらうれしいのですが。
よろしくお願いします。
634デフォルトの名無しさん:2011/01/20(木) 06:55:23
(;´Д`)
635デフォルトの名無しさん:2011/01/20(木) 07:04:26
あまりに率直な反応に朝から盛大にフイタ
636デフォルトの名無しさん:2011/01/20(木) 07:49:03
いい方法=そんな気持ち悪くネストした配列を作らない
というか要素が一つの配列を作るのはなぜ?
変数名だかメソッド名だか知らんが全部が全部抽象化されてるからまるで意味が伝わらん
637デフォルトの名無しさん:2011/01/20(木) 07:50:48
>>633 は Lisper
638デフォルトの名無しさん:2011/01/20(木) 08:10:14
最初の定義に従った
a[0] = [aa]
a[2] = [bb]
とその下のa[0]・a[2]の関係がわからなくなった時点で読むのをやめた。
639デフォルトの名無しさん:2011/01/20(木) 08:30:45
一行目で読むのをやめた。
640デフォルトの名無しさん:2011/01/20(木) 12:40:09
>>633
そういう言語じゃねぇから!

ちゃんとクラス分けしたほうがいい。
後は連想配列が使えないか考えろ。

それ以上はレスの内容だけだと何とも言えない。どんなデータが合ってそこから最終的に何を出したいのか書いてくれないと。
641デフォルトの名無しさん:2011/01/20(木) 14:26:06
「レスの内容だけ」とかじゃなくて、全く意味がわからなかった
642デフォルトの名無しさん:2011/01/20(木) 14:28:36
これは多分どれだけ抽象的な話を理解できるか試すテスト。

643デフォルトの名無しさん:2011/01/20(木) 15:11:48
俺は笑い男が仕掛けた罠だと思ったんだけど、違うのか
644633:2011/01/20(木) 16:19:48
すみません、説明が間違ってました。
aはハッシュで、値とキーが2重配列と配列になっています。
マルコフモデルの会話BOTを作りたいのですが、
詳しい説明文作っていたら一つ思い付いたので、
明日試してきます。
645デフォルトの名無しさん:2011/01/20(木) 16:22:45
面白いことやってるのかもしれんが、説明する力をもっと養えよ
646デフォルトの名無しさん:2011/01/20(木) 16:40:28
>>644
面白そう
読んだことないけど「恋するプログラム―Rubyでつくる人工無脳」で
紹介されてるような事をやりたいのかな
647デフォルトの名無しさん:2011/01/20(木) 18:03:46
>>645
御意、自然言語能力も足りないよね
648デフォルトの名無しさん:2011/01/21(金) 01:32:23


メールの送信元に「本庄」を指定して送信すると文字化けするが、これを本庄で送りたい。
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自体が消えてしまう。


649デフォルトの名無しさん:2011/01/21(金) 02:17:56
マルコフモデルみたいなbot作りたいならライブラリあるし、使ってみて中身覗いてみるとかの方が
Rubyに合った作り方学べるしいいと思うよ。

マルコフ連鎖するだけならそんなに難しくないし
650デフォルトの名無しさん:2011/01/21(金) 12:44:28
そして、ただライブラリを使うだけの自称プログラマが生まれる
おれのことだけどな

それにそのライブラリがRubyに合った作り方をしてる保証はないだろ
651デフォルトの名無しさん:2011/01/21(金) 13:15:57
適切なライブラリを探してきて使いこなすだけでもそれはそれで能力のうちだと思う。
652デフォルトの名無しさん:2011/01/21(金) 13:51:45
能力かもしれないけど能力が高いとは言えないし、
替えという点でもいくらでもきくね。
だから「ヒューマンスキル」みたいな言葉を必要以上に叫んだりするんだろうけど。
653デフォルトの名無しさん:2011/01/21(金) 14:47:33
よいプログラマはよいコードを書く。偉大なプログラマは
よいコードを借りてくる
654デフォルトの名無しさん:2011/01/21(金) 15:16:15
1. 偉大なプログラマ→よいコードを借りてくる
2. よいコードを借りてくる→偉大なプログラマ

1は成り立つが、2は必ずしも成り立たつわけではない
勘違いするな
655デフォルトの名無しさん:2011/01/21(金) 15:26:32
なにそのみんながみんな偉大にならなきゃいけないみたいな雰囲気は?
656デフォルトの名無しさん:2011/01/21(金) 15:27:46
てか不毛な言葉遊びはここでやるもんじゃなかろ
657デフォルトの名無しさん:2011/01/21(金) 15:29:21
世の中に偉大なプログラマしかいなくなったら
誰がコーディングするの?
658デフォルトの名無しさん:2011/01/21(金) 16:41:21
集合理論の基本を言葉遊びとかレベル低すぎだろ
659デフォルトの名無しさん:2011/01/21(金) 17:01:09
>>657
「偉大なプログラマは利用できるものは利用する」ということだろ。
利用するものがなきゃお手上げなのは、なんちゃってプログラマ。
660デフォルトの名無しさん:2011/01/21(金) 19:59:27
初心者スレでツマンネー雑談してる奴は
2chに張り付きすぎなんじゃね
ネタもないのに無理して書きこむこともないのに
661デフォルトの名無しさん:2011/01/21(金) 20:34:35
「ライブラリ使ったらすぐにできるよね」
っていう人は信用ならない。
ライブラリ叩くだけで終わるような書き捨てコードしか書いた経験のない輩。
662デフォルトの名無しさん:2011/01/21(金) 20:36:43
ライブラリのバグに直面したり
自分でライブラリ書いたりした経験が無いんだろうね
663デフォルトの名無しさん:2011/01/21(金) 21:39:06
あったら「すぐできる」なんて言わないだろw
664デフォルトの名無しさん:2011/01/21(金) 23:14:07
ライブラリで省ける時間なんてキーを叩く回数だけじゃん
Ruby使えば一行で済むよって言ってる奴と変わらん
665デフォルトの名無しさん:2011/01/22(土) 09:03:04
シフトキーの回数が減るなら大歓迎
666デフォルトの名無しさん:2011/01/22(土) 17:33:37
ライブラリ使うなやって奴は
そもそもRubyのような高級言語を使うなよ
Cとかアセンブラ使え
いや言語から作れよ
つーかOSから作れ
667デフォルトの名無しさん:2011/01/22(土) 17:38:00
head first railsって古いバージョンなの?
668デフォルトの名無しさん:2011/01/22(土) 18:54:55
だれも使うなとか言ってないと思うのだが
669デフォルトの名無しさん:2011/01/22(土) 19:05:18
http://amat-prog.blogspot.com/2011/01/head-first-rails.html
> Head First Railsを購入した。Railsのインストール方法については記述なし、Rails2.1-2.3に対応しているそうだ。内容はぼちぼち読むことに。
670デフォルトの名無しさん:2011/01/22(土) 19:28:05
OSを一から作るのあこがれるな。
昔、B-TRONのフリープロジェクトみたいなのあったけど
どうなったんだろ?
671デフォルトの名無しさん:2011/01/23(日) 10:22:05
ウェブブラウザを1から作るのも憧れるよな。
グーグルの広告でもよくでてたじゃん?グーグルが1からつくったとかいうやつ
672デフォルトの名無しさん:2011/01/23(日) 10:44:09
「1から」は叩かれまくったせいか、今は削られてる。
673デフォルトの名無しさん:2011/01/23(日) 11:47:56
0からならともかく、1からだったら別にいいじゃん
674デフォルトの名無しさん:2011/01/23(日) 13:31:04
WebKitが0一つで賄えるとは思えん。
675デフォルトの名無しさん:2011/01/23(日) 14:42:37
>>673
序数の「0th」って未だに違和感あるな
676デフォルトの名無しさん:2011/01/23(日) 15:43:33
>>675 は VB しか使ったことないのな
677デフォルトの名無しさん:2011/01/23(日) 17:08:09
require 'cgi/session'
require 'cgi/session/pstore'

で、セッションを使いたいのだが
セッションファイルの保存されている場所とか、
セッションファイルの状態を確認するにはどうしたらいいのです?
678デフォルトの名無しさん:2011/01/23(日) 17:14:30
あと、サーバーを丸ごと再起動してからアクセスすると、ログイン情報が消えるっぽくて、毎度ログインしないといけなくなるのはどうしたら防げるのでしょうか?
679デフォルトの名無しさん:2011/01/23(日) 17:47:41
パスワード無しにするとか
680デフォルトの名無しさん:2011/01/23(日) 19:44:01
>>677
リファレンスならるりまで検索無料です

検索欄に CGI::Session::PStore いれて検索
Rubyリファレンスマニュアル全文検索 | るりまサーチ
http://rurema.clear-code.com/


CGI::SessionかCGI::Session.newがあやしい
singleton method CGI::Session::PStore.new
http://rurema.clear-code.com/1.8.7/method/CGI=3a=3aSession=3a=3aPStore/s/new.html


> [PARAM] option:
> ハッシュを指定します。
>
> 以下の文字列をキーとして指定することができます。
>
> tmpdir
>
> セッションデータを作成するディレクトリの名前を指定します。デフォルトは Dir.tmpdir です。

実際に確認
ruby -rtmpdir -e "p Dir.tmpdir"

環境によって結果は変わるので略
あとはCGI::SessionかCGI::Session.newのtmpdirを再起動しても永続化するパスに変更すればいいんじゃないのか
681デフォルトの名無しさん:2011/01/23(日) 19:44:44
x CGI::SessionかCGI::Session.newがあやしい
o CGI::Session::PStoreかCGI::Session::PStore.new
682デフォルトの名無しさん:2011/01/23(日) 19:46:00
混乱させるなよ

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を実行しているから、このときまた書かれて
るのかな。
686デフォルトの名無しさん:2011/01/24(月) 19:26:26
初心者です。教えてください。
今、「たのしい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


よろしくお願いします。
687デフォルトの名無しさん:2011/01/24(月) 19:27:42
URLが間違ってるんじゃない
688デフォルトの名無しさん:2011/01/24(月) 19:30:44
>>687
さんくす!
おいらの3日を1分で解決したあなたに脱帽です。

ありがとうございました!
689デフォルトの名無しさん:2011/01/24(月) 19:45:35
むしろそんなことに三日気付かなかったお前に脱帽だわ
690デフォルトの名無しさん:2011/01/24(月) 20:02:52
エラーメッセージが的外れっていうのは良くある
691デフォルトの名無しさん:2011/01/24(月) 20:04:16
的外れというか、知ってなきゃわからないというか。
692デフォルトの名無しさん:2011/01/24(月) 20:12:07
プログラミングの初歩はエラーメッセージの本当の意味を知ることからだからな
693デフォルトの名無しさん:2011/01/24(月) 20:22:50
まぁ、getaddinfo などのキーワードが出ているのにそれでぐぐったという
報告がない以上、例外メッセージのどこに手がかりがあるかも気付いて
いなかった可能性が高いが。
694デフォルトの名無しさん:2011/01/24(月) 20:36:50
つまりミスプリをした本が一番悪いということだな
695683:2011/01/24(月) 20:43:02
サーバーを丸ごと再起動した場合は、復活してこないようだ。
# reboot
696デフォルトの名無しさん:2011/01/24(月) 20:48:09
そうじゃなくてURL間違えてるかもしれないということを三日間一度も思わなかったのがすごいなって言いたかったんだ

>>694
おかしいな、俺の手元の「たのしいRuby 第3版」(第1刷)の149ページではURLはあってるんだが
697デフォルトの名無しさん:2011/01/24(月) 20:52:10
不親切。初心者が困らないように、
www.ruby-lan.orgもエイリアスにしておくべき。
698デフォルトの名無しさん:2011/01/24(月) 21:16:23
>>694の解釈の方向は、いくらなんでもおかしいと思う
699デフォルトの名無しさん:2011/01/25(火) 07:21:04
YARVとLLVMってどっちが強いの?
700デフォルトの名無しさん:2011/01/25(火) 13:26:14
696の下では、初心者は伸びないとおもった
701デフォルトの名無しさん:2011/01/25(火) 13:47:24
日本の夜明けは暗い
702デフォルトの名無しさん:2011/01/26(水) 13:10:03
Ruby 1.8.7 、環境は Win7 です。
Ruby で HTTP リクエストの PUT と DELETE を実装したいのですが、
net/http でやろうとしたらうまくいかないうえに、
推奨されていません的な警告が出てるような気がします。

このようなことが起こる理由としてなにか考えられることはありますか?
また、みなさんはこのようなとき、どのようなやり方で実装なさるのでしょうか?
教えてください。
703デフォルトの名無しさん:2011/01/26(水) 14:59:59
>>702
何したら何が返ってきたか書いて。
405 Method Not Allowed が返ってきてるだけだったりしないよね?
704デフォルトの名無しさん:2011/01/26(水) 15:08:00
>>702
>>1くらい読んでくれよ。
> 質問には以下を書くこと。へたくそな質問は再提出を要求される。
>  ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
>  ・エラーメッセージ(自力で訳さずなるべくそのままで)
>  ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
>  ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
705デフォルトの名無しさん:2011/01/26(水) 15:26:58
>>703 >>704
お手数おかけして申し訳ないです…。
以後、このようなことがないようにします。

>>703
Net::HTTP::Put ってのを使って、他サーバに XML の文字列を渡しているのですが、

data = '<?xml version=〜' ってとこで
warning: Object#type is deprecated; use Object#class

と出ます。
わかる人からしたら「まんまじゃねーか」と言われるのであろうことは
察しがついたのですが、申しわけありません。よろしくお願いします。
706デフォルトの名無しさん:2011/01/26(水) 16:34:51
ローカル変数にXML文字列を渡すだけで
本当にそのエラーが出るのか?
肝心のNet::HTTP::Putをどう使ってるのかさっぱりわからんし
707デフォルトの名無しさん:2011/01/26(水) 17:09:20
>>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
}
708デフォルトの名無しさん:2011/01/26(水) 23:00:16
インタプリタと仮想マシンの違いってなんなんでしょうか…?
709デフォルトの名無しさん:2011/01/26(水) 23:59:48
>>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だと解釈されて…これはないか。
711デフォルトの名無しさん:2011/01/27(木) 00:10:02
ライブラリが古いんじゃ?
712707:2011/01/27(木) 10:47:40
>>707 です。解決しました。実装できました。
data = のあとの XML の中に定義されていない変数が混ざっていました…。
みなさんに親身に考えていただいたのに、
こんなしようもない原因で本当に申し訳ないです…。

>>709 >>710
本っ当に助かりました!阿呆な理由ですみません…。
どうもありがとうございました。
713デフォルトの名無しさん:2011/01/27(木) 11:51:36
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 ????
714デフォルトの名無しさん:2011/01/27(木) 12:17:40
>>713
配列で返すとか。

return x.cost1, index
return [x.cost1, index]

↑どちらも同じ
715デフォルトの名無しさん:2011/01/27(木) 12:36:49
そういうことなのか?
動的なメソッド呼び出しを聞いてるんじゃなくて?
716デフォルトの名無しさん:2011/01/27(木) 13:00:31
>>713
@costを配列にしろ
caseなんか使わず1行で終わる
717デフォルトの名無しさん:2011/01/27(木) 14:18:28
>>713
x = ABC.new
x.method("cost#{index}").call
でおk

此所嫁
http://www.ruby-lang.org/ja/man/html/Method.html
718デフォルトの名無しさん:2011/01/27(木) 16:27:47
__send__でもいけるんじゃないかな?

x.__send__("cost#{index}")
719713:2011/01/27(木) 19:01:12
>>717氏の
x.method("cost#{index}").call
を採用させていただきましたありがとうございます。
おかげですっきりしました。ちょっと考えたら配列でもいけそうですね。
>>718氏のやつもぐぐってみます。
720デフォルトの名無しさん:2011/01/28(金) 16:01:01
Ruby1.9のバイトコードはどういうライセンスになるんだろう。
ソースコードと同じなのかなと思ったけど、他のライブラリのソースコードとごちゃ混ぜ状態になってたりしたら?
721デフォルトの名無しさん:2011/01/28(金) 16:39:52
今のところ内部形式しかなくてexportできないし、
requireとかincludeしてもごちゃ混ぜにはならないよ。
722デフォルトの名無しさん:2011/01/28(金) 23:09:11
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パターンなのでしょうか?
「スケジューラにクエリを入れる」という仕組みをどう書けばいいのか分かりません。
723デフォルトの名無しさん:2011/01/28(金) 23:48:28
>Rubyに限らない一般的な質問です。


        ┼─┐─┼─  /  ,.          `゙''‐、_\ | / /
        │  │─┼─ /| _,.イ,,.ィ'    ─────‐‐‐‐ 。←>>722
        │  |  │     |  |  | イン ,'´ ̄`ヘ、   // | \
                          __{_从 ノ}ノ/ / ./  |  \
                    ..__/}ノ  `ノく゚((/  ./   |
        /,  -‐===≡==‐-`つ/ ,.イ  ̄ ̄// ))  /   ;∵|:・.
     _,,,...//〃ー,_/(.      / /ミノ__  /´('´   /   .∴・|∵’
  ,,イ';;^;;;;;;;:::::""""'''''''' ::"〃,,__∠_/ ,∠∠_/゙〈ミ、、
/;;::◎'''::; );_____       @巛 く{ヾミヲ' ゙Y} ゙  
≧_ノ  __ノ))三=    _..、'、"^^^     \ !  }'
  ~''''ー< ___、-~\(          ,'  /
      \(                 ,'.. /
724デフォルトの名無しさん:2011/01/29(土) 04:29:03
rails含めてのruby開発環境ってやっぱり
eclipse+なんかプラグインが一番いいの?
725デフォルトの名無しさん:2011/01/29(土) 05:27:02
>>722
どちらの方式が良いかはケースバイケースだが、Rubyの場合は
マルチスレッド方式のほうが優れたパフォーマンスになるケースが多い。

一般にIOオブジェクトのI/O操作メソッドは、その操作が完了する迄、
リターンしない(=ブロックされる)。この様な一般的なケースでは、
シングルスレッド&select方式だとそのI/O完了待ち時間がネックになって、
CPUは空いてるのにシステム全体としてのスループットが頭打ちになる。
マルチスレッド方式では、あるスレッドがI/O待ちになれば他のスレッドへ
自動的に切り替わるから、CPUを有効に活用できる(無駄な待ち時間が無い)。

逆にselect方式が性能上で優位になるのは、標準のスレッドスケジューラの
オーバヘッドすら問題視されるような、性能要求に対してシビアな環境。
Rubyは、そんなシビアな環境下でのプログラミングには不適な軽量言語。

現実のサーバソフト設計では、システム全体はマルチスレッドで動かし、
個々のスレッド内で複数のI/Oを扱う場合にselectを用いるという、
第三のハイブリッド方式が採用されるケースが多いのではないかと思う。
例えばWebサーバなら、個々のワーカースレッドで、ネットワークからの
リクエスト受信待ちとディスクへのリード完了待ちをselectで同時に監視する。
726デフォルトの名無しさん:2011/01/29(土) 07:08:47
>>725
Ruby 1.8についていえば、スレッド切り替えがクソ重すぎて使い物にならない。
C10KどころかC1Kでも100ms毎にデータが飛んできたらスレッド切り替えだけで
CPUを使い果たす。
727デフォルトの名無しさん:2011/01/29(土) 09:19:14
>>724
個人的にはNetBeansがおすすめ。
http://ja.netbeans.org/
728デフォルトの名無しさん:2011/01/29(土) 09:21:35
>>724
とりあえず先端を走っているような人はエディタとターミナルでやってる。
729デフォルトの名無しさん:2011/01/29(土) 09:23:09
>>727
おい、昨日の今日でそれを奨めるのは微妙だぞ。
http://netbeans.org/community/news/show/1507.html
730デフォルトの名無しさん:2011/01/29(土) 09:23:11
>>724
俺も現時点ではNetBeansが良いと思う
Eclipseは動作がやや重く、インターフェースがわかりにくいという印象

しかしRDEは完全に更新止まっちゃったな
731デフォルトの名無しさん:2011/01/29(土) 09:39:47
732デフォルトの名無しさん:2011/01/29(土) 09:39:59
NetBeans IDE 7.0からRuby on Railsのサポートを廃止
733デフォルトの名無しさん:2011/01/29(土) 10:00:52
利用者少ないし忙しいからRailsは切るわ、ってことか
734デフォルトの名無しさん:2011/01/29(土) 10:05:50
Eclipseの後追いは止めたのか、
それともオラクルマジック発動か。
はたまた…
735722:2011/01/29(土) 10:42:19
>725
大変勉強になりました。
「第三のハイブリッド方式」というのが私のケースでも最適に思えるので、複雑で頭が混乱しそうになりますが
設計レベルからもう一度書き直してみます。
# LLに親しむとプログラミングが楽しくなる反面、安易にコードを書き散らさない慎重さが必要だと感じます。
736デフォルトの名無しさん:2011/01/29(土) 11:26:14
もう未来が無いとしても、現状NetBeansより万人におすすめできる
Ruby開発環境ってないしな
737デフォルトの名無しさん:2011/01/29(土) 11:48:36
ローカル変数とメソッドが紛らわしくてたまに困ります。
メソッド呼び出しは全てに()をつける、というのはありでしょうか?
738デフォルトの名無しさん:2011/01/29(土) 11:54:08
>>737
それで見やすくなるのならそうすればいいけど、
人のコードを読むのは楽にならないぞ。
739デフォルトの名無しさん:2011/01/29(土) 13:04:35
>>725
「第三のハイブリッド方式」で言う「マルチスレッド」って Ruby (のグリーンスレッド) でも可?
740デフォルトの名無しさん:2011/01/29(土) 14:40:01
>>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の冒頭で書いたように、ケースバイケースで対応(設計/実装方式)を判断・決定すべきだろう。
741デフォルトの名無しさん:2011/01/29(土) 16:35:24
>>737
それ、むしろRubyのメリットのはずなんだが
変数かメソッドかを気にしなきゃいけない状況からなんとかしたら?
742デフォルトの名無しさん:2011/01/29(土) 16:57:00
メソッド呼び出しにselfとかレシーバーつけるとか
743デフォルトの名無しさん:2011/01/29(土) 18:00:29
ローカル変数かメソッド呼び出しかわからないということは、
一つのメソッドが大きすぎるんじゃないの?
744722:2011/01/29(土) 18:08:15
>>725の第二の方式について考えていました。(スケジューラ方式?)
>>717のやり方を参考にすれば動かせそうに思えたので。
selectに渡せるものがIOのサブクラスだけなので、
スケジューリングというものをイベントを文字列としてパイプに突っ込むことで表現して、
FIFOでそれを取り出して処理するようにしてみました。

イメージとしては
1. クライアントがリクエストを送信
2. サーバのソケットに貯まる
3. IO.selectで受信して、リクエストをイベント化してイベントキューに登録
4. selectしてイベントキューにイベントが入っていればそれを取り出して処理
5. 処理の一部をイベント化して再度、イベントキューに登録
6. 以上をループ

実際のコード: http://codr.cc/FB0CA8BB04

こういう実装が実用的なのか、性能が出るのか、などについて教えていただけるとありがたいです。
あと、文字列をパイプに入れるのはダサイので他のやり方があれば…。
745240:2011/01/29(土) 18:47:42
へんてこな部分があったので書き換えました……。

実際のコード: http://codr.cc/E5A0F569F9
746デフォルトの名無しさん:2011/01/29(土) 23:24:14
イベントのキューもIOにするの??forkして処理するなら分かるけど
ワーカースレッド用意して同一プロセス内で処理するなら、メッセージを文字列化するのは無駄だから
http://www.ruby-lang.org/ja/man/html/Queue.html
とか使ったほうがいいのでは

あとこれね
self.__send__(*str.chomp.split(","))
747デフォルトの名無しさん:2011/01/29(土) 23:49:27
まずはRubyのスレッドやRevやEventMachineで実装してみては。
自作するのはそれでだめなのがわかってからでもいいかと。
748デフォルトの名無しさん:2011/01/30(日) 03:20:00
>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アーキテクチャの劣化版くらいは書けるようになりたいです。
749デフォルトの名無しさん:2011/01/31(月) 18:40:42
binmode設定するとエンコーディングがASCII-8BITになるのはバグですか?
750デフォルトの名無しさん:2011/01/31(月) 18:47:14
どこがバウやねん
751デフォルトの名無しさん:2011/01/31(月) 19:27:00
バグ
正確には仕様変更の未反映
本来あるべき動作は以下のとおりだけど現状ではIOのエンコーディングに影響しASCII-8BITになる

るりま曰く
> binmode
> Windows の IO にはテキストモードとバイナリモードという2種類のモードが存在します。
> これらのモードは上で説明した IO のエンコーディングとは独立です。改行の変換にしか影響しません。

ruby-dev:36827 辺り参照。
752デフォルトの名無しさん:2011/01/31(月) 19:27:07
>>749
それは正常な動作です

p 'foo'.force_encoding('BINARY').encoding
# => #<Encoding:ASCII-8BIT>

ASCII-8BIT と BINARY は同じ意味
で、あってるのかな?
753749:2011/01/31(月) 19:28:11
自己解決しました
754752:2011/01/31(月) 19:30:11
>>751
ええっ!そうだったの?
しらんかった
755デフォルトの名無しさん:2011/01/31(月) 21:38:45
仕様だよ
バイナリファイルの読み込みに支障が出たからあえてASCII-8BITにした
るりまは間違い
756デフォルトの名無しさん:2011/01/31(月) 21:48:51
このあたりはかなりケンケンガクガクだったような気が
757デフォルトの名無しさん:2011/01/31(月) 21:53:27
カンカンガクガクまたはケンケンゴウゴウのいずれかをお使いください。
758デフォルトの名無しさん:2011/01/31(月) 22:34:22
いや待て。バイナリファイルの読み込みはエンコーディングの影響を受けないそれ用のメソッドがあるから
IO自体をASCII-8BITにする必要はない。
支障があるとすればバイナリファイルをテキスト読み込みメソッドで読んだ場合だけど
それ自体がおかしいから考慮しなくていい。
759デフォルトの名無しさん:2011/02/01(火) 19:45:20
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 はそのバイト列をそのままファイルに格納するだけ、と理解しました。
他に正しい方法があれば教えてください。
760デフォルトの名無しさん:2011/02/02(水) 03:38:35
NKFはやめとけ
761デフォルトの名無しさん:2011/02/02(水) 04:09:58
文字コードはいっつも頭痛くなる。認識変更が簡単にできるライブラリとかできねーのかな?
762デフォルトの名無しさん:2011/02/02(水) 12:31:49
下記サイトを見て思ったのですが、単に引数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 # 変更されてない
763デフォルトの名無しさん:2011/02/02(水) 12:47:00
> 下記サイトを見て思ったのですが、単に引数aとbが指し示すオブジェクトを変えただけ
> で(a = a + 1)、実引数のほうは変化していないので値渡しだと言っているのには
> ちょっと違和感を感じます。

なぜどのように違和感を感じるのでしょうか。
それが値渡しなのですが。
764デフォルトの名無しさん:2011/02/02(水) 12:59:27
fixnumもオブジェクトのはずなのに、なぜ値型の値渡しみたくなってるかって疑問?
数値型がイミュータブルだからとかそういう話なんじゃないかな知らんけど
765デフォルトの名無しさん:2011/02/02(水) 13:07:19
左辺渡し右辺渡しって呼ぼうぜ!
766デフォルトの名無しさん:2011/02/02(水) 13:20:31
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
767デフォルトの名無しさん:2011/02/02(水) 14:02:18
つまりどういうことです?
768デフォルトの名無しさん:2011/02/02(水) 16:39:25
>>763-764
>>764さんのおっしゃる通りです。

そのサイトではメモリ図を用いて説明されていて、仮引数に渡すときFixnumだとC言語のように
そのコピーが作られて(新たなオブジェクトを作るということでしょうか?)、Arrayだと
参照の値渡しだと言ってます。

しかも、Fixnumはイミュータブルなのに値を変化させたと書いてあります。
私の認識では、a = a + 1というのは、a + 1という新たなFixnumオブジェクトを作って、その
オブジェクトをaが指し示すというもので、値を変化させるというものではないと思ってました。

Rubyは数値も含めて全てがオブジェクトとうたわれているので、ArrayだろうとFixnum
だろうと同じような扱いをするのだと思っていたから違和感を感じました。

すなわち、ArrayやFixnumを含む全てが参照の値渡しだと思っていたということです。

実は、Fixnumのような数値はいわゆる値型のように実装(ふるまうと)されているということでしょうか?
それとも私の認識(もしくはこのサイトに対しての私の読解)にどこか間違いがあるのでしょうか?
769デフォルトの名無しさん:2011/02/02(水) 16:50:43
>>768
> それとも私の認識(もしくはこのサイトに対しての私の読解)にどこか間違いがあるのでしょうか?

結論から言うと Yes。
Ruby は、Fixnum だろうと Array だろうと「値渡し」。

まず Fixnum のような、配列じゃない場合は、値渡しになることは理解していると思う。
Ruby の Array は何を保持しているかというと、配列の先頭のアドレスだけを持っている。
(配列の実体を直接持っているわけではない。C言語での、char と char* の違いと同じ)

そしてメソッドに Array を渡すと、メソッドを受け取った側(仮引数)では、アドレスがコピーされている。

メソッドの呼び元の Array と、メソッドの中の Array の実体はそれぞれちがうものであり、
配列の先頭アドレスを、2重に持っていることになるので、「値渡し」ということができる。

※先頭アドレスを二重に持っているものの、それぞれが同じ場所を指しているので、
配列の実体( >>762 のるびまでの、[10, 20])は1つしかない。
770デフォルトの名無しさん:2011/02/02(水) 16:58:12
>>769
お前はそもそも値型/参照型の値渡し/参照渡しの計4通りあること理解してるのかと小一時間
771デフォルトの名無しさん:2011/02/02(水) 17:10:46
>>768
あなたの解釈は概ね合っているんじゃないかな。
ただ、内部の実装については知らないのかも。

Fixnumなどの一部のクラスのインスタンスも「見かけ上は」他のオブジェクトと同様であるかのように振る舞う。
「見かけ上」であって、内部的には即値の処理に解釈されている。
でもそれによってRuby上での扱いが変わるということはほとんど無い。
強いて言えば、状態を変更するような動作はできない、という程度。

でもその「状態を変更できない」のがポイントで
「状態を変更出来ない、同じオブジェクト」への参照をコピーするということは
変数の値そのものをコピーすることにほぼ等しいワケ。
だって参照の値と扱う値は1対1に対応するんだから。

そのサイトの説明は若干はしょってるというか、細かい話を避けてるんだろうけど
強ち間違った説明かと言うとそういうワケでもないよ。
772デフォルトの名無しさん:2011/02/02(水) 17:20:18
オブジェクトの中身を操作するからややこしくなる

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] #もちろん変化なし
773デフォルトの名無しさん:2011/02/02(水) 17:32:41
>>765
それが多分一番混乱しないんだが、
まず左辺値右辺値とは何かがわかってないとわかんない。
774デフォルトの名無しさん:2011/02/02(水) 18:31:01
>>770
値渡し、参照型の値渡し、参照渡しの計3通りだよね?
775デフォルトの名無しさん:2011/02/02(水) 19:55:25
>>771
Fixnumのようなクラスは、値型のように実装されているということならこのサイトの説明も
納得です。

ただ、Rubyは全てがオブジェクトだとうたっているので、実装上そうなっているとはいえ、
値型のようなふるまいの説明をするのはどうかなとは思いますが。
776デフォルトの名無しさん:2011/02/02(水) 20:59:26
だからrubyは全部値渡しだっつってんだろバカかおめー
777デフォルトの名無しさん:2011/02/02(水) 21:04:47
納豆が Ruby サポート終了するけどおまいらどうすんの?
778デフォルトの名無しさん:2011/02/02(水) 21:19:43
>>775
るびまはるびま(雑誌)でしかない。一般人向けに直感的に分かりやすい表現をしているのではないかと。
仮にRubyに公式な言語定義書というものが存在して、その中での記述であれば問題がもしれないが....。
779デフォルトの名無しさん:2011/02/02(水) 22:15:11
>>777
もともと使ってないからなんともならない。
780デフォルトの名無しさん:2011/02/03(木) 00:52:55
え、NetBeansがサポート終了するのってRailsだけじゃなかったの?
781デフォルトの名無しさん:2011/02/03(木) 01:00:36
>>775
引数の渡し方を理解する上においては、Fixnumが即値がどうかは特に関係がない
Fixnumが即値であろうがなかろうが、結論は同じで、Rubyの引数は値渡しだよ
782デフォルトの名無しさん:2011/02/03(木) 01:13:53
NetBeansにとってRubyはRoRの一部に過ぎないのでは。
783デフォルトの名無しさん:2011/02/03(木) 03:24:13
>>759
1.8.7かこんな風だったか

・ソースの文字コードがSJISで、文字列をSJISで扱うなら、
 ruby -Ksや$KCODE='s'のように文字コードを指定する
 http://rurema.clear-code.com/1.8.7/method/Kernel/v/=2dK.html

・書き出しはWindowsで文字コード変えた場合は

 outFile = open(outFileName, "w")

でなく、バイナリモードで

 outFile = open(outFileName, "wb")

・NKFやNKFを使うKconvは罠があるので気をつけて使う。
NKF使うならNKF.nkfに追加で"-xm0"がいるんじゃなかろうか。半角→全角カナとMIMEの解釈の防止のため。
http://www.ruby-lang.org/ja/man/html/trap_Kconv.html
http://www.ruby-lang.org/ja/man/html/trap_NKF.html

1.8.7のWindowsでは何が推奨なんだ?
784デフォルトの名無しさん:2011/02/03(木) 06:55:24
>>775
>Fixnumのようなクラスは、値型のように実装されているということならこのサイトの説明も
>納得です。

「値型」って何のこと?Javaでいうプリミティブ型のことかな。

Rubyは全てがオブジェクトだけどFixnumの実装はポインタに整数値を埋め込んでいるのは確か。
でもそう実装になっていることと、引数が値渡しであることは関係がない。


>ただ、Rubyは全てがオブジェクトだとうたっているので、実装上そうなっているとはいえ、
>値型のようなふるまいの説明をするのはどうかなとは思いますが。

勘違いしているなあ。
Fixnumだろうが、それ以外の通常のオブジェクトだろうが、Rubyでは値渡しであり、
どちらの場合でも同じふるまいなんですけど。

なぜそんな勘違いをしてしまったのか知りたい。

785デフォルトの名無しさん:2011/02/03(木) 07:53:41
Javaのオブジェクトは参照渡しとかいう謎の都市伝説に騙されてたとかじゃないの?
786デフォルトの名無しさん:2011/02/03(木) 07:59:47
値型/参照型って話がなんで値渡し/参照渡しに?
勘違いしてるのはどっちだ
787デフォルトの名無しさん:2011/02/03(木) 08:15:16
そもそも「値型」「参照型」って何?
788デフォルトの名無しさん:2011/02/03(木) 08:17:42
何この痴呆症滴ループ
自分でサンプルコード書いてobject_idチェックしろ
質問者はド素人じゃないっぽいしそれくらい出来るだろ
789デフォルトの名無しさん:2011/02/03(木) 08:47:10
>>787
Cで言うポインタと普通の型の違い
790デフォルトの名無しさん:2011/02/03(木) 08:59:20
791デフォルトの名無しさん:2011/02/03(木) 10:11:15
Ruby用語集 - Rubyリファレンスマニュアル
http://www.ruby-lang.org/ja/man/html/Ruby_CDD1B8ECBDB8.html#Immediate.20Value

Immediate Value
参照ではなく、実際の値が変数に格納さ れるもの。
Rubyの現在の実装ではFixnum、Symbolとnil/true/falseだけが即値である。

しかし、Fixnumが即値でないRubyの実装があっても構わないし、モデル上全ての値が
オブジェクトへの参照であると考えても差し支えない。
792デフォルトの名無しさん:2011/02/03(木) 10:23:03
Rubyは参照の値渡しだろ?
PHPは値渡しで、&をつけると参照渡し
じゃね?
793デフォルトの名無しさん:2011/02/03(木) 10:29:36
>>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 # 変更されてる
794デフォルトの名無しさん:2011/02/03(木) 10:59:51
>>786が言及しているけど、質問者はFixnumが値型なのか参照型なのかを聞いているのに
値渡し/参照渡しの回答をしている人が多いね。
質問への回答でなく単に値渡し/参照渡しの話をしたいだけかもしれないけど。

質問者の質問の仕方が悪いのと、引用したるびまの記事が値渡し/参照渡しについての説明
というのも影響しているんだろう。
795デフォルトの名無しさん:2011/02/03(木) 11:11:06
>>792
>PHPは値渡しで、&をつけると参照渡し

PHPは知らないが、Cの場合は全てが「値渡し(call by vale)」。
変数の前に単項演算子 & を付けると、その変数のアドレス値(ポインタ値)を得えることができるし、
それを関数の引数として渡すこともできる。(たとえば f(&x) など)
けれどその場合もアドレス値を「値渡し」しているのであって、
それを「参照渡し(call by reference)」とは言わない。

ただし、Cだけを語る文脈の中で、その「アドレス値の値渡し」のことを「ポインタ渡し」と呼ぶことがある。
C限定の文脈であれば、「ポインタ渡し」という用語は間違いではない。
でも、Cのポインタ渡しが「参照渡し」と混同して解釈されがちなのは事実で、注意して用いるべき。

繰り返すけど、これはCの場合。PHPは知らないよ。(同じかもしれないし、違うかもしれない)
796デフォルトの名無しさん:2011/02/03(木) 11:35:40
>>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のカキコ(同一人物?)は迷惑に感じる。(ぶっちゃければウザイの一言)
797デフォルトの名無しさん:2011/02/03(木) 11:42:35
>>794
>>796みたいなアホが出てくる事を予想して先回りしてたわけだな
798デフォルトの名無しさん:2011/02/03(木) 11:55:46
「即値」の使い方でお里が知れる
799デフォルトの名無しさん:2011/02/03(木) 12:03:53
radrails入れたら、普通のruby開発もできますか?
800デフォルトの名無しさん:2011/02/03(木) 12:42:11
>>796
全然間違ってるよ。Ruby においては、
オブジェクトに原始的(primitive)かどうかなんて区別はない。

> Cとは異なり、純粋OOPであるRuby(あるいは元祖であるSmalltalk)には、
> アドレス(ポインタ)という概念がそもそも存在していないことに注意すべき。

んなことはない。むしろ Java より Ruby のほうが C の思想を引きずっていると思う。

むしろ >>769 あたりが FA なんじゃないかと。とはいえ >>794 の通りかも知れないけど。
801796: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の解説を一からひっくり返してくれる解釈があれば、すごく嬉しかったりする。
802800: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 かそうでないかというのはあるけど。
803デフォルトの名無しさん:2011/02/03(木) 13:37:50
>>801
自分もRubyを使うだけで、内部のことまで考えたことはないんだけど、、、

>>791でFixnum等が実装では即値扱いになっているのは、イミュータブルだから即値として扱っても
オブジェクトとしての性質が保たれるのと、パフォーマンスの問題もあるんではないだろうか?

例えば、Fixnumをオブジェクトとして実装するとGCの回収が必要となり、速度的な問題を生じるとか。
(即値だとGCがいらないかとか知らないけど)

他の実装はどうなんだろうか?
JRubyやIronRubyもCRubyと同じような実装なんだろうか?
>>791では即値でない実装があっても構わないと書いてあるし。
804デフォルトの名無しさん:2011/02/03(木) 14:06:28
>>802
ファイルオープンのモードはJavaでも引きずってなかったっけ?
最近は違うのかも知れんけど。
805デフォルトの名無しさん:2011/02/03(木) 14:18:14
分かったから初心者スレでやるなよ。
806デフォルトの名無しさん:2011/02/03(木) 15:06:08
>>801
「値渡し」「参照渡し」はプログラミング言語一般の引数の渡し方を説明するための用語であって
Ruby内の引数の渡し方を説明するためだけの用語ではない。

「Rubyに当てはめようとする……」という指摘がそもそも無理筋。
807デフォルトの名無しさん:2011/02/03(木) 16:16:21
こういう流れって例外なく不毛だよな
808デフォルトの名無しさん:2011/02/03(木) 18:19:33
raise
809デフォルトの名無しさん:2011/02/03(木) 20:37:15
rescue
810デフォルトの名無しさん:2011/02/03(木) 20:38:48
ensure
ループする話も必要
811デフォルトの名無しさん:2011/02/03(木) 21:44:36
ちょっと疑問におもったんだが、参照の値渡しでもポインタでもない、これぞ参照渡しな言語ってどんなんがある?
できればメジャーなやつで

あと参照の値渡しとRubyの値渡しは何が違う?
812デフォルトの名無しさん:2011/02/03(木) 21:47:58
> ちょっと疑問におもったんだが、参照の値渡しでもポインタでもない、これぞ参照渡しな言語ってどんなんがある?
> できればメジャーなやつで

C++
813デフォルトの名無しさん:2011/02/03(木) 21:49:16
なぬ、Cは値渡しなのにC++は参照渡しなの!?

814デフォルトの名無しさん:2011/02/03(木) 21:52:37
&
815デフォルトの名無しさん:2011/02/03(木) 21:54:52
たしかこんなかんじ

$ 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 の別名として機能する
816デフォルトの名無しさん:2011/02/03(木) 21:59:22
>>811
自分が知る範囲ではPerl,PHP,VB6,VB.NET/C#/C++はサポートしてる
VB6はデフォルトで参照渡し
C++/VBNET/C#はデフォルトが値渡しだが参照渡し用構文がある
Perlは参照渡しも値渡しも可能。
PHPも参照渡し可能。詳細忘れた
Cは直接サポートしてないが参照渡しのエミュレートは出来る
さっき初心者スレに書いたが元ネタはこのスレか
817デフォルトの名無しさん:2011/02/03(木) 22:24:22
参照の値渡しとかわかりづらい表現をするからややこしくなる
818デフォルトの名無しさん:2011/02/03(木) 23:20:57
ものすごくわかりやすいです
819デフォルトの名無しさん:2011/02/03(木) 23:30:19
>>817
参照渡しとごちゃ混ぜになるよりは相当マシ
820デフォルトの名無しさん:2011/02/03(木) 23:36:42
>>815
そういうのrubyでどう書くのか悩んだわ昔
821デフォルトの名無しさん:2011/02/04(金) 00:34:59
>>794
最初の質問である>>762を見る限りでは
値渡しと参照渡しについて質問してるとしか思えない
822デフォルトの名無しさん:2011/02/04(金) 03:09:47
>>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
823デフォルトの名無しさん:2011/02/04(金) 05:41:24
>>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
824デフォルトの名無しさん:2011/02/04(金) 08:42:50
はいはい即値即値

class Fixnum; attr_accessor :a;end
a = 1
b = 1
a.a = 99
p b.a #=> 99
825デフォルトの名無しさん:2011/02/04(金) 08:54:48
値渡し:
値がコピーされる
値の中に含まれる「ポインタ」や「参照の値」を使って
参照先への操作をしない限り、呼び出し元への影響はない

参照渡し:
変数そのものが渡される
呼び出し先での仮変数への代入は、呼び出し元の変数への代入と同義になる

参照の値渡し:
「参照の値」がコピーされて渡される
その参照先への操作は呼び出し元に影響するが
仮引数そのものへの代入は、単に参照先が書き換えられるだけで元環境に影響しない
826デフォルトの名無しさん:2011/02/04(金) 08:56:24
参照渡しの欄間違えた
×仮変数
○仮引数
827デフォルトの名無しさん:2011/02/04(金) 10:47:23
>>821
その後の質問(>>768)で、質問者がFixnumが値型/参照型なのかを聞いているのがわかったけどな。

>実は、Fixnumのような数値はいわゆる値型のように実装(ふるまうと)されているということでしょうか?

その質問以降でも、値渡し/参照渡しのレスをしている人が多くいるってことは、質問者の質問
の仕方が悪かったのは否めないけど。
828デフォルトの名無しさん:2011/02/04(金) 15:17:22
>>811
Pascal, Modula-2
使ったことないから知らないけど、Delphiってやつもそうか?
829デフォルトの名無しさん:2011/02/04(金) 17:05:05
>>796
ここ最近のスレで「Rubyは値渡しじゃない」という独自の解釈を押し付けようとしているのは同一人物なのか?
ここは初心者スレなんだから混乱させるのはやめろよ

あえていうなら、Rubyは値渡しじゃないという例を見せてくれよ

他の言語では>>815のように参照渡しがサポートされているがRubyは違うだろ

>>817
「参照の値渡し」がややこしいなら、単に「値渡し」でいいよ。

Java、C#でclassをnewして、特に参照渡しだと指定せずにメソッドの引数に指定するとそれは「値渡し」だよね
参照を「値渡し」するのは今時の言語では珍しくない方法じゃないのかな?
830デフォルトの名無しさん:2011/02/04(金) 18:07:43
作者自身(Matz)がRubyは値渡ししかありませんって言ってるんだから、あるとしたら
バグか他の実装でしょう。
831デフォルトの名無しさん:2011/02/04(金) 18:11:05
創造神まっつと>>796のたたかいが、いまはじまる
832デフォルトの名無しさん:2011/02/04(金) 18:50:26
もしかしてPerlって参照渡ししかないんじゃないの?
だからいちいち関数に入ったところでコピーを作るんだよね?
833デフォルトの名無しさん:2011/02/04(金) 21:03:36
たった一か月前のしかもこのスレの話題を繰り返すおとこのひとって……
参照という言葉の認識の違いですれ違ってるところまで同じかよ
とりあえず「オブジェクトそのものは渡してません」でいいじゃないか
834デフォルトの名無しさん:2011/02/04(金) 21:17:10
「渡す」の定義からしないとな
835デフォルトの名無しさん:2011/02/04(金) 23:14:55
コピーコンストラクタが走ってうんちゃらみたいな話はC++でこりごりよ
836デフォルトの名無しさん:2011/02/05(土) 00:43:22
>>827
それ単に混同してるだけじゃね?
まあ本人から説明を聞かないことにはわからんけど
837836:2011/02/05(土) 00:44:14
ここでの混同は、「最初の質問者が」混同してるんじゃないかってことね
838デフォルトの名無しさん:2011/02/05(土) 01:37:58
基本的には、動的にしかクラスのインスタンスをつくることができない言語は当時は英断だと思ったが、
# クラスがnewしかできないいくつかの言語ね

さすがのC++のカオスをしった前には、あれは英断だったんだなと思わざるをえなかった
C++の動的生成と静的生成わかれているのは、殺すためのハンター試験じゃないのかと


839デフォルトの名無しさん:2011/02/05(土) 01:41:11
てかさ、こういう定義の話題みたいなのはお前ら、コードでかけないのか?

俺の解釈、お前の解釈なんてしったこっちゃねーんだよ。
コンピューターのようにコードを出して、そのままの解釈をさせるようにかんけつに書け

というわけでお前らの「値渡し」と「参照の値渡し」「(あと>>796のなんだっけ?w)」
定義のコードをかけ。来てるのがRubyistじゃないならRubyじゃなくてもいい
840デフォルトの名無しさん:2011/02/05(土) 02:15:25
その通りだ
じゃあまずは>>839いってみようか
841デフォルトの名無しさん:2011/02/05(土) 02:17:42
kill -KILL 840
842デフォルトの名無しさん:2011/02/05(土) 02:49:50
ガラケー案件ダル過ぎる…
300万程度の案件が1ヶ月ぐらいかかったわ
もう絶対にやらん
843デフォルトの名無しさん:2011/02/05(土) 07:52:26
>>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

即値の場合は参照の値渡しではなく、普通の値渡し。
844デフォルトの名無しさん:2011/02/05(土) 07:56:34
追記
>>817
参照の値渡しという言葉は必要。初心者にはだるいだろうけど、覚えてもらうしかない。
値渡しと参照渡しと参照の値渡しが区別できないと、激しく混乱することになる。
845デフォルトの名無しさん:2011/02/05(土) 07:57:10
色々と落ち着け
846844:2011/02/05(土) 08:23:59
>>845
え?落ち着いてるよう。眠いけど。寝る。
847デフォルトの名無しさん:2011/02/05(土) 08:35:50
> > あえていうなら、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に渡すんだから
849デフォルトの名無しさん:2011/02/05(土) 09:12:20
>>848
ちがうお
なんちゃら渡しは関数の実引数と仮引数の関係を説明する言葉
その例では関数が出てきていないのでなんちゃら渡しは問題にならない
850デフォルトの名無しさん:2011/02/05(土) 09:46:51
>>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 のまま
851デフォルトの名無しさん:2011/02/05(土) 09:57:26
メーリングリストでも話題があるけど、これは参照渡し?
自分には難しくて何をやっているのかわからないけど。

[ruby-list:47825] Re: 参照渡しの実現方法は?
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/47825
852デフォルトの名無しさん:2011/02/05(土) 10:30:47
> 100という定数名があり

こんな実際にはできないたとえを持ち出したら
もうめちゃくちゃなのだが
853デフォルトの名無しさん:2011/02/05(土) 10:36:42
>>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]になる
854デフォルトの名無しさん:2011/02/05(土) 10:37:34
>>852
んじゃ「リテラルがすべて同様の値を持つインスタンスへの参照だったら」とでも書けばいい?
855デフォルトの名無しさん:2011/02/05(土) 10:41:24
そうか冬休みか
856デフォルトの名無しさん:2011/02/05(土) 11:05:41
>>851
同じ挙動を実現できているってこと

参照渡しのルールは、渡された変数名が、元々の変数を表すかのように振舞うこと
例で何をやってるかって、メソッド呼び出し元から
変数名と変数実体との対応表(binding_obj)を受け取って、
それのもとでevalしてるだけ
857デフォルトの名無しさん:2011/02/05(土) 11:43:58
こんだけ初心者が混乱してるってことは
るびまの記事がちっともわかりやすくなかったということか
しくしく
858デフォルトの名無しさん:2011/02/05(土) 11:53:52
>>854
お前「同様」の意味わかってないだろ
859デフォルトの名無しさん:2011/02/05(土) 12:01:24
>>856
d
擬似参照渡しみたいなことは一応できるってことね。

>>857
執筆者?
860デフォルトの名無しさん:2011/02/05(土) 12:30:22
>>858
「同一の」…でいいのかな
861デフォルトの名無しさん:2011/02/05(土) 12:31:49
いや同一じゃないな、やっぱ同様…じゃなければ何と表現すればいいんだ
100という数値そのものではなく、100という数値のオブジェクトのことを
862デフォルトの名無しさん:2011/02/05(土) 12:37:29
最近の Ruby 案件見てると往年の VB みたいになってきたな。
863デフォルトの名無しさん:2011/02/05(土) 12:46:23
一般に参照渡しを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にしたいわけじゃないんでしょ?
即値のほうが効率は良いから
864デフォルトの名無しさん:2011/02/05(土) 13:38:11
>>862
どんな感じ?
865デフォルトの名無しさん:2011/02/05(土) 17:17:27
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
866デフォルトの名無しさん:2011/02/05(土) 17:39:25
もうmatz神が直々に聖書をお書きになれば良いのでは。
867デフォルトの名無しさん:2011/02/05(土) 18:24:00
>>866
Matz神はかく語りき

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1514
> これは間違い.rubyには値渡ししかなく引き数として与えられた変
> 数の値を変えても元の式の値は変わりません.ただし,オブジェク
> トの参照が渡るので値に対して破壊的な操作は可能です.

でも参照を渡してるんだから参照渡しじゃんという人が
いまだ絶たないので困っちゃうというお話
実際Cのポインタの値渡しを参照渡しと説明してる本は
名著とされる本の中にも結構あるからね
868デフォルトの名無しさん:2011/02/05(土) 19:36:11
はい終了
869デフォルトの名無しさん:2011/02/05(土) 21:49:25
Rubyのコーディングスタイルについて教えてください。

メソッド呼び出し時に、レシーバを省略すると変数と紛らわしいという問題に対して、
常にレシーバを付ければいいという主張をする人もいるようですが、
Ruby習熟者の方が良しとしているのはどういうスタイルでしょうか。

常にレシーバを付ければいい、という主張に従うと、
単純にインスタンス変数にアクセスする際にもselfが付きまとうことになり
逆に可読性が落ちるように思います。

アクセサメソッドだけ例外にして他のメソッドにのみレシーバを付ける、
なんてルールを作ってしまうと更に悲惨なことになりそうです。

やはり省略できるものは省略してしまう方がスッキリするんでしょうか。
870デフォルトの名無しさん:2011/02/05(土) 22:08:38
インスタンス変数は直接アクセスする
871デフォルトの名無しさん:2011/02/06(日) 01:09:54
>>869
命名が不適切なのかもしれない。リファクタリングを検討
通常、動詞的な命名をされるはずのメソッド名と、
名詞的な命名をされるはずの変数名(アクセサメソッド名)は混同されない

>常にレシーバを付ければいいという主張をする人もいる
初耳
872デフォルトの名無しさん:2011/02/06(日) 01:19:50
>>869
個人の好みにもよると思うが、レシーバは必要なければ
可読性のために省略する方が多数派
確かMatzもそっちを推奨してたと思う(ソース不明)

俺は、「レシーバを省略するとローカル変数と記法が被る」という点は
紛らわしさもあるものの、Rubyのメリットでもあると思ってるので
基本的にためらわず省略するようにしている

>>871
「単純なアクセサではないが名詞的な命名をするメソッド」というのもあるから
一概には言えない。Pathname#realpathとか
873デフォルトの名無しさん:2011/02/06(日) 01:37:49
>>867
ワロタ
もうこれテンプレに入れとけw
874デフォルトの名無しさん:2011/02/06(日) 02:22:24
matzはレシーバ必ず付けろ派だったと思う。どこかで読んだが忘れた。
それ以来railsのモデルクラス内でカラムにアクセスする時に常にself付ける癖がついた。
875デフォルトの名無しさん:2011/02/06(日) 02:40:32
>>869
海外のRuby本やRails本を読むと、
・selfは本当に必要なとき以外は付けない(省略できるときは必ず省略する)
・ローカル変数と紛らわしくても気にしない
・returnも書かない。return XXXとは書かずに XXX だけ。
という方針のようだ。
特に2番目は、ローカル変数と同じように見えるからいいのだとでもいいそうな
雰囲気がある。

def current_average
 @data / @amount
end

def main
 print current_average  ← こんなやつね
end
876デフォルトの名無しさん:2011/02/06(日) 03:01:28
ローカル変数なんて一瞬つかってすぐに捨てるようなもんなんだから、
紛らわしいとかいう時点でウンチを書いてるんだと自覚すべし。
877デフォルトの名無しさん:2011/02/06(日) 04:49:55
>>867
1.Rubyは値渡し(=引数として渡された変数の値を変えても元の値は変わらない)
2.ただしオブジェクトの参照の*値*が渡される(=オブジェクトの破壊的変更は可能)

1. hoge(hage) と呼ばれたとき hage = fuga としても呼び出し元の hage は壊れない
2. hoge(hage) と呼ばれたとき hage.hige = fuga とすると呼び出し元の hage が壊れる

っていう意味だから*値渡し*で問題ないんだけど
誤解されやすい表現だよね
878デフォルトの名無しさん:2011/02/06(日) 05:01:00
>>867
>実際Cのポインタの値渡しを参照渡しと説明してる本は
>名著とされる本の中にも結構あるからね

C++ で参照が導入される前に書かれた C の本ではそう書いてあっても全くおかしくない
879デフォルトの名無しさん:2011/02/06(日) 06:11:13
おまいらそういう話題はruby-listでやれよ…
おっと、リアルじゃ恥ずかしくてうかつに口だせないかw
880デフォルトの名無しさん:2011/02/06(日) 07:38:51
おまえ誰だ?
881デフォルトの名無しさん:2011/02/06(日) 09:04:05
Perlだと局所的に使いたい変数があるときは { }(中括弧)を使いますが、
Rubyではどうするのでしょうか?

my $x = 1;

{
my $x = 2;
}

print $x # => 1
882デフォルトの名無しさん:2011/02/06(日) 10:00:44
同じ変数名を使おうとしている命名規則もしくは設計を見直す
883デフォルトの名無しさん:2011/02/06(日) 10:21:30
>>881
Proc作ってcallするという方法はある……けど、誰かが使ってるのは見たことない

たぶん、局所的に使いたい変数があるときには
メソッドに分割するだけで十分だからじゃないかな
884デフォルトの名無しさん:2011/02/06(日) 10:24:45
要するに、できない
885デフォルトの名無しさん:2011/02/06(日) 10:31:40
>>882-884
Rubyでは、命名規則やメソッド分割で対処するんですね。
了解しました。
886869:2011/02/06(日) 13:10:16
返事が遅れてすいません。
皆様ありがとうございました。勉強になりました。

省略できるselfは極力省略する、というスタイルで行くことにします。
アクセサとローカル変数の紛らわしさはやはり残りそうですが。。これも慣れるのかな
887デフォルトの名無しさん:2011/02/06(日) 16:49:49
変な文化だよな。常にself付けておけば間違いも無くなるのに。
888デフォルトの名無しさん:2011/02/06(日) 17:07:25
>>887
書きやすさ・読みやすさと、間違いの少なさのトレードオフだよ
889デフォルトの名無しさん:2011/02/06(日) 17:10:14
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して頂けると幸いです。
891デフォルトの名無しさん:2011/02/06(日) 18:17:23
>>887
>>869と同じ罠に何度もハマってからPythonのself明示する考え方もありだなと思えてきた。

意図しない動作をするということならテストを書けばいい話だし、
ちょっとしたスクリプトならそれこそselfの明示は面倒だし
Rubyの方針もありだと思うけど
892デフォルトの名無しさん:2011/02/06(日) 18:19:16
>>890
erbじゃだめなのか?
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' を開けません。

となります。
895デフォルトの名無しさん:2011/02/06(日) 21:43:35
スレ違い
896デフォルトの名無しさん:2011/02/06(日) 23:43:19
>>890
devkitでコンパイルしたほうが早そう
897デフォルトの名無しさん:2011/02/07(月) 00:22:57
>>893
cで実装されたerubyは遅いのでお勧めしない。まだerbのほうがまし。
898デフォルトの名無しさん:2011/02/07(月) 01:28:29

>>897
ありがとう。
しかし
ERBでもerubyでもロードの度にCPUが100%になる。。。

899デフォルトの名無しさん:2011/02/07(月) 02:13:34
>>898
確か特定のバージョンのRubyは糞だったはず
900デフォルトの名無しさん:2011/02/07(月) 02:55:51
>>899
1.8.7です。
901デフォルトの名無しさん:2011/02/07(月) 08:28:14
>>893
すでに書かれてるけど、erubyはCで書かれているのに遅いし、print文を使っていて柔軟性に欠けるので、やめたほうがいい。

>>897
erbはファイルをrubyコードに変換する部分が遅いので、erubisのload_fileを使ったほうがいい。
eruby = Erubis::Eruby.load_file('example.rhtml')
print eruby.run(binding)
902デフォルトの名無しさん:2011/02/07(月) 08:46:31
いやもうeRubyもerubisも時代遅れ。これからはtenjinの時代(とerubisの作者がいってた)。
ttp://twitter.com/idesaku/status/2719421881
903デフォルトの名無しさん:2011/02/07(月) 16:24:21
配列の第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]]
904デフォルトの名無しさん:2011/02/07(月) 16:34:32
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)

とか。

もっとスマートに出来そうだけど。

906デフォルトの名無しさん:2011/02/07(月) 17:24:10 BE:133988148-PLT(18000)
Rubyのsortって安定じゃなかったんだ・・・
単なる数値じゃなくオブジェクトの配列をソートすることが多いRubyなのに
907デフォルトの名無しさん:2011/02/07(月) 17:32:38
matzを説得できれば…
http://redmine.ruby-lang.org/issues/show/1089
908デフォルトの名無しさん:2011/02/07(月) 18:02:48
>>904
酷い脊髄反射レスだなこりゃ
909デフォルトの名無しさん:2011/02/07(月) 18:18:04
>>905
ありがとうございます。
期待通りの動作が得られました。
910デフォルトの名無しさん:2011/02/07(月) 18:22:36
fruits.each.with_index.sort_by{|v,i| [v[0],-i]}.reverse.map{|v,i| v}
こんなんとか?まだ分かり辛い気もする
911デフォルトの名無しさん:2011/02/07(月) 18:30:02
sort_by だと降順が入るとめんどくさくなるんだね。
912デフォルトの名無しさん:2011/02/07(月) 18:31:29
Ruby使ってる人って安易に配列とかハッシュ使っちゃうよね。
そいでマップしてソートしてリバースしてマップして(ry
みたいな気が狂ったようなコードを書いちゃう。
913デフォルトの名無しさん:2011/02/07(月) 18:41:47
次はもうちょっと気の利いた煽りを頼む
914デフォルトの名無しさん:2011/02/07(月) 19:52:19
fruits.reverse_sort_by_with_index {|v, i| [v, i]}
915デフォルトの名無しさん:2011/02/07(月) 20:17:23
>>912
Rubyではお手軽に書けるけど、他のLLだと「やりたくても、できない」からね
いわゆる「酸っぱい葡萄」かな?
916デフォルトの名無しさん:2011/02/07(月) 22:00:24
>>905がなにやってるのかまったくわからないのでだれかかいせつたのむ
917デフォルトの名無しさん:2011/02/07(月) 22:17:42
>>916
メソッドと記号の意味を追えば分かる
俺でも分かったんだから大丈夫
918デフォルトの名無しさん:2011/02/07(月) 23:20:20
>>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
919デフォルトの名無しさん:2011/02/08(火) 00:10:12
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.
921デフォルトの名無しさん:2011/02/08(火) 00:46:37
i=0
fruits.sort_by{|v| [v[0].bytes.map(&:-@),i+=1]}
922デフォルトの名無しさん:2011/02/08(火) 01:35:11
>>919
ワラタw
923デフォルトの名無しさん:2011/02/08(火) 03:07:09
サルにプログラム書かせるのやめろ
924デフォルトの名無しさん:2011/02/08(火) 03:08:12
>>923
それを言うなら無限の猿

無限の猿定理 - Wikipedia
http://ja.wikipedia.org/wiki/%E7%84%A1%E9%99%90%E3%81%AE%E7%8C%BF%E5%AE%9A%E7%90%86
925デフォルトの名無しさん:2011/02/08(火) 06:32:59
さ、ドヤ顔で卒業論文で無限猿をやってのけた俺に謝ってもらおうか。
926デフォルトの名無しさん:2011/02/08(火) 06:44:02
>>905
fruits.sort_by.with_index{|v,i| [v[0], i]}

Enumerator#with_indexの真骨頂
927デフォルトの名無しさん:2011/02/08(火) 07:01:15
>>926
降順じゃないじゃん
928デフォルトの名無しさん:2011/02/08(火) 07:15:00
素で、勘違いしてた、非常にはずかしい
なかったことに

fruits.sort_by.with_index{|v,i| [v[0], -i]}.reverse
929デフォルトの名無しさん:2011/02/08(火) 07:27:48
反射的にレスすることで安定は失われた・・・!
930デフォルトの名無しさん:2011/02/08(火) 08:01:12
reversetって安定じゃないの?
931デフォルトの名無しさん:2011/02/08(火) 08:19:47
Ver 1.8.6やマニュアル↓に載っている安定ソートの方法を使うなら、こんな感じかな。

instance method Enumerable#sort_by
http://doc.ruby-lang.org/ja/1.9.2/method/Enumerable/i/sort_by.html

i = 0
fruits.reverse.sort_by {|v| [v[0], i += 1] }.reverse
932デフォルトの名無しさん:2011/02/08(火) 08:26:30
あ、そっか。
>>928みたいに、インデックスをマイナスにすれば、最初のreverseがいらないね。
俺も脊髄反射だw

i=0
fruits.sort_by {|v| [v[0], -(i += 1)] }.reverse
933デフォルトの名無しさん:2011/02/08(火) 08:33:55
というかデクリメントすればいいだけか。。
連投すまそ。

i=0
fruits.sort_by {|v| [v[0], i -= 1] }.reverse
934デフォルトの名無しさん:2011/02/08(火) 08:54:53
個人的には>>931がわかりやすい
935デフォルトの名無しさん:2011/02/08(火) 09:41:33
ただのsortは安定じゃないけど、sort_byは安定ってこと?
936デフォルトの名無しさん:2011/02/08(火) 09:45:54
>>924
これで思い出したけど円周率3.14...のなかにはどんな数字の組み合わせも入ってる可能性があるらしいね
例えば、人の名前を数字に当てはめてそこに生年月日とか生まれた時間とかくっつけたのを絶対見つけることができるらしい
それなら未来のこともどうにか数字にしてわかるんじゃね?って研究してる人の話を聞いたことがある
937デフォルトの名無しさん:2011/02/08(火) 09:53:02
「可能性があるらしい」から
「絶対見つけることが出来る」という結論は出ないと思う
円周率に0が100個続く列があるか、ってのは証明が難しいんじゃなかったか
938デフォルトの名無しさん:2011/02/08(火) 09:54:07
引数で安定/不安定が選べるといいね。

sort(:stable => true){|a| a<=>b }
sort(:method => :merge){|a| a<=>b }
939デフォルトの名無しさん:2011/02/08(火) 10:07:16
>>937
ごめんスレ違いなんだけど
その研究者が講演とかをやってそれを実演してるらしい
そこに用意してある円周率はたった数千〜万桁?ほどなんだけど
希望者の名前と生年月日の組み合わせは100%あるとのこと
940デフォルトの名無しさん:2011/02/08(火) 10:08:21
インデックスつきの無限ループというのは、Rubyでは通常どのようにするのでしょうか?

limit = 5
loop do |i|
break if i > limit
end
941デフォルトの名無しさん:2011/02/08(火) 10:14:29
>>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
だな
942デフォルトの名無しさん:2011/02/08(火) 10:17:13
>>939
名前をどういうふうに数字にしてるのかしらないけど、
単純に確率の問題。

0が100個だと、10の100乗ぶんの1の確率だから、10の100乗桁あれば、
あってもおかしくない。そんだけ。
943デフォルトの名無しさん:2011/02/08(火) 10:31:18
>>941
d
944デフォルトの名無しさん:2011/02/08(火) 10:53:10
>>935
リファレンスマニュアルにも書いてるけど、安定じゃないよ。
sort_by 使ってる例は i が肝。
945デフォルトの名無しさん:2011/02/08(火) 10:56:39
>>940
それ無限に見えないけど、こんな感じ?
5.times do |i|
end
946デフォルトの名無しさん:2011/02/08(火) 11:07:02
loopはなぜ引数付きブロックを取れないのかと
何回か話題になってた記憶がある
947デフォルトの名無しさん:2011/02/08(火) 11:19:23
loop_with_indexとかあっても良いような
948デフォルトの名無しさん:2011/02/08(火) 11:21:44
>>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
949デフォルトの名無しさん:2011/02/08(火) 12:52:10
元と同じような使い方で、かつそれによってソースが読みやすくなるなら
元の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);
}
950デフォルトの名無しさん:2011/02/08(火) 15:17:21
loopにはStopIteration例外を補足してループ終了するという機能がついてます
Enumeratorを外部イテレーターとしてまわすときにloopと組で使うわけです

counter = 5.times
loop do
p counter.next
end
while true
p counter.next #whileだと例外でエラー終了
end
951デフォルトの名無しさん:2011/02/08(火) 15:23:16
なにそれかっこいい
952デフォルトの名無しさん:2011/02/08(火) 15:52:38
loopを置き換えるならオリジナルloopを呼ぶか
自分でStopIteration例外を補足する必要があります

カウンター付きloopの提案
引数つけたときだけカウンター回せばいいんじゃないだろうか
これなら既存の使い方のパフォーマンスも落ちないはず
ついでにEnumeratorも生成できれば便利なのでは
引数は succできるやつとEnumeratorのみ受け付けれられればいいかな

でも、名前がだめだめなのでまったく採用の見込みは無さそう
loopにはカウンターをまわすイメージが無いので
953デフォルトの名無しさん:2011/02/08(火) 15:54:52
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)
954デフォルトの名無しさん:2011/02/08(火) 18:13:02
というより最近のrubyだと
loop.with_index{|_,i| p i }
とかできるんだなw初めて知った
955デフォルトの名無しさん:2011/02/08(火) 18:49:36
うおー、そんなのできるんだ、と嬉々としてコード書き直してみたら、
サーバ(CentOS5)のRubyが1.8.5だったときの絶望感ったらないね。
956デフォルトの名無しさん:2011/02/08(火) 18:50:35
>>954
どういう仕組みなの?それ
957デフォルトの名無しさん:2011/02/08(火) 19:13:42
>>954
おおー、ブロックなしだと、Enumeratorを返すようになったんだ。
958デフォルトの名無しさん:2011/02/08(火) 20:05:33
あまりうれしくない気がする
[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が付いてくるし
959デフォルトの名無しさん:2011/02/08(火) 20:41:56
>>955
おいやめろ
960デフォルトの名無しさん:2011/02/08(火) 22:57:00
実用面での欠落そっちのけでオナニー記述ばっかり充実していくなRubyは
961デフォルトの名無しさん:2011/02/08(火) 23:13:39
言語オタク用言語ですから(キリッ
962デフォルトの名無しさん:2011/02/09(水) 01:05:19
dupできるかどうか判別する方法はないでしょうか?

初期値を比較的安全に設定するために、指定された初期値を dupして代入しようとしましたが、
初期値が数値などの場合 dup で例外が発生します。
respond_to? でdupできるかどうか判別できるかとも思いましたが、dup できなくても true が返ってきます。
今は仕方がないので例外を捕捉して例外時はそのまま代入していますが
963デフォルトの名無しさん:2011/02/09(水) 01:40:36
headline_url = "http://yp.ladio.livedoor.jp/stats/list.xml"
xml = open(headline_url)
aa = REXML::Document.new(xml).root

このコードでxmlに<とか>が入ってるとパースエラーになってしまうんですがどうすればいいでしょうか
964デフォルトの名無しさん:2011/02/09(水) 02:18:26
>>963
ねとらじの運営にゴルァするのがベストかと
well-formedなXMLを送ってこいと
965デフォルトの名無しさん:2011/02/09(水) 02:27:09
そのライブラリは使ったことないけど、もしそれが本当なら
xmlの必須要素である<>があるとエラーなんて、ライブラリとしてあってはならないバグだ
即刻バグ報告すべき
966デフォルトの名無しさん:2011/02/09(水) 02:30:11
>>965
ちゅっちゅ
967デフォルトの名無しさん:2011/02/09(水) 07:43:46
>>964-965
すみません勘違いでした
ちなみ>>963でかってに変換されてるんですけど>は&gt;、<は&lt;になっていて問題無いみたいです
実際は唐竍鰍ンたいな機種依存文字が入ってるいるとエラーになっています
968デフォルトの名無しさん:2011/02/09(水) 09:09:14
>>967
>>1
> ■質問する人へ
969デフォルトの名無しさん:2011/02/09(水) 09:40:46
>>962
・ dup も clone も浅いコピーであることについてここに判子押した上で実際に dup して rescue する
・ コストが高いことを理解した上で Marshal.load(Marshal.dump(arg)) する
・ 引数を複製しないと安心できないというのは70パーセントくらいの割合でデザインミスなので考え直す

お好きなものを張り切ってどうぞ
970デフォルトの名無しさん:2011/02/09(水) 10:18:41
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

でどうだ
971デフォルトの名無しさん:2011/02/09(水) 10:22:58
ご飯食べてないので変な書き方になった

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 の例外が出てしまう場合は…
972デフォルトの名無しさん:2011/02/09(水) 10:34:28
まあ元の XML のエンコーディング指定が間違ってるのがそもそもいけないんですけどね
encoding="shift-jis" って宣言したなら Shift_JIS 以外の文字は入れないで頂きたい
@ABとか鰍ニかとかご法度

本当は REXML::Document.new(xml, :encoding=>'CP932') とか指定できるのが望ましいんだけど
そういう構造にはなってないなさすが原産地外国

ちなみに Nokogiri だと Nokogiri::XML.parse(xml, nil, 'CP932') で動作する
973デフォルトの名無しさん:2011/02/09(水) 16:08:22
>>970
ありがとうございます解決しました
機種依存文字は意識したこと無かったので勉強になりました

>>968
すいません気をつけます
974デフォルトの名無しさん:2011/02/09(水) 19:23:39
>>969
反応ありがとうございます。
3番目の設計見直しでいきます。
1番目は今のやり方です。浅いコピーだということは承知しておりまして、比較的安全にと書いたのはそういう意味です。言葉足らずでしたね
2番目、今回例外処理のコスト高を何とかしたいというのが動機でしたので。
active_supportではduplicable?を定義してますね。姑息な手段に思えます。ruby本体でサポートして欲しいなあ
975デフォルトの名無しさん:2011/02/09(水) 19:34:16
>>963
昨日見たときは "\x13" だかの変な制御コードがあって引っかかってたけど、今日見たら無くなってた
976デフォルトの名無しさん:2011/02/10(木) 00:12:01
そろそろ初心者を卒業できたかなと思ってこのスレを開いてみたのに
スレ内容が全く理解できないという。
977デフォルトの名無しさん:2011/02/10(木) 00:27:44
nilチェックについて質問です。あるインスタンスの真偽値を取得する際に
if hoge && hoge.isXXX?
こんな操作を毎回やっているのですが、rubyらしい手法はありますか?
設計が悪いとかnullObject使えとかそういう感じなんでしょうか
978デフォルトの名無しさん:2011/02/10(木) 00:38:00
>>976
だせえ!やーいやーい!
979デフォルトの名無しさん:2011/02/10(木) 00:44:59
>>976
お前童貞だろ
980デフォルトの名無しさん:2011/02/10(木) 00:50:57
>>977
if param.is_foo? といきなり書くと param が nil だった場合 NoMethodError になってしまう
かと言って if param && param.is_foo? と書くのは正しいのだが冗長に見えて仕方がない
なんとかする方法はありませんか?

というような質問はしょっちゅう出るのだが、汎用な回答はない
if param && param.is_foo? と書くようにするのがいちばん無難
あとは NoMethodError が出ることを駄目データが出たメッセージとして許容するとか
981デフォルトの名無しさん:2011/02/10(木) 01:28:45
nullチェックとかめんどくさいだけだからしなくていい。
nullを返す場合があるメソッドを読んだ時にだけチェックすればいいのだ。
982977:2011/02/10(木) 02:36:28
>>980-981
なるほど、まあ無難と言われてちょっと安心です。
methodや機能それぞれについてアサーション(一般的な意味を含む)
をしっかり考えてそれを前提にすれば、nullチェックなどいちいち書かなくてもいい
という意見にも納得です。
983デフォルトの名無しさん:2011/02/10(木) 02:37:02
Rails厨なら Object#try
984デフォルトの名無しさん:2011/02/10(木) 02:56:35
むしろ「ここはnilを返さないはずだ」という認識を持っている場所ではnilチェックをしてはいけない。
無意味なnilチェックでバグを見逃すことになる。
985デフォルトの名無しさん:2011/02/10(木) 04:03:48
nullってなんですか(素)

nil が起こす NoMethodError はかなり特別だ
たいていの Ruby プログラマは、これを「nil かどうかチェックして分岐しとけよ糞が」とは思わない
むしろいわゆるシグナルとして残す

ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども
986デフォルトの名無しさん:2011/02/10(木) 05:00:38
>>985
> nil が起こす NoMethodError はかなり特別だ
はあ?

> ホントは nil が起こす NoMethodError は特別扱いして名前付けて欲しいんだけども
はあ?

自称上級者気取りが初心者を混乱させるのはやめてほしいな

987デフォルトの名無しさん:2011/02/10(木) 06:29:01
はあ?だけじゃ解からんだろ。
息が臭いだけ。
988デフォルトの名無しさん:2011/02/10(木) 07:52:31
どこが特別なのか全然伝わってこないよってことだろ
989デフォルトの名無しさん:2011/02/10(木) 07:54:13
ついでに書くと、Rubyでは一般にis_xxx?というメソッド名は付けない
たいていis無しのxxx?にする
990977:2011/02/10(木) 08:39:20
それだとif hoge is xxx thenというふうに読めなくて嫌だったりする。
?そのものはboolを返すという記号としては有りだと思うけど。
991デフォルトの名無しさん:2011/02/10(木) 11:48:13
>>985
Java だと、ぬるぽだな。これが一番わかりやすいかな。
C だとSegmentation fault になる。
segmentatino fault だと色々原因がありそうだけど、殆どがぬるぽなんだよな。
992デフォルトの名無しさん:2011/02/10(木) 12:01:30
誰かが nil を発生させてその結果処理が滞りました、ということを検出できる例外だからな
ものによっては rescue で自前の例外を発生させてユーザーにわかりやすく知らせたりもするぬ
993デフォルトの名無しさん:2011/02/10(木) 12:20:14
12時半に次スレ立てる
35分になっても立ってなかったら失敗なので次の人どうぞ
994デフォルトの名無しさん:2011/02/10(木) 12:30:42
うめ
995デフォルトの名無しさん:2011/02/10(木) 12:33:04
うめ
996デフォルトの名無しさん:2011/02/10(木) 12:36:14
立ってないのに埋めようとすんな
997デフォルトの名無しさん:2011/02/10(木) 12:51:35
ごめん
998デフォルトの名無しさん:2011/02/10(木) 13:09:53
立った?
999デフォルトの名無しさん:2011/02/10(木) 13:10:34
いいえ
1000デフォルトの名無しさん:2011/02/10(木) 13:12:40
新スレ立てムリポ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。