トップページ⇒tech
995コメント369KB

Ruby 初心者スレッド Part 55

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

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

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0133デフォルトの名無しさん2014/07/20(日) 23:58:13.27ID:BWtO9PBt
全く調べてもいないけどreadlinesがうんたらかんたら
0134デフォルトの名無しさん2014/07/21(月) 01:10:13.39ID:15AfdAD4
>>132
http://takuya-1st.hatenablog.jp/entry/20110717/1310890039
0135デフォルトの名無しさん2014/07/22(火) 20:19:49.75ID:E9EuZoOu
入力xに対して、3つの値を返すeuclidという関数があったとして

[x, y, z] = euclid(x)

のようにデータを代入する方法はないでしょか?
今のところ、

data = euclid(x)
x = data[0]
y = data[1]
z = data[2]

と書いています
もうちょっとわかりやすい書き方があれば教えて下さい
0136デフォルトの名無しさん2014/07/22(火) 20:24:38.12ID:RgZSUrOG
x,y,z=[1,2,3]
0137デフォルトの名無しさん2014/07/22(火) 20:51:15.29ID:E9EuZoOu
>>136
[]括弧がいらないだけでできたんですね
教えて下さりありがとうございます
0138デフォルトの名無しさん2014/07/23(水) 01:47:58.13ID:C1MAaOhX
start = Time.now
puts start - Time.now



これの結果が0.052003だった場合、0.05秒、つまり50ミリ秒ということですか?
0139デフォルトの名無しさん2014/07/23(水) 02:02:06.43ID:vbN86xg+
>>138
http://docs.ruby-lang.org/ja/2.1.0/method/Time/i/=2d.html
0140デフォルトの名無しさん2014/07/24(木) 22:48:33.94ID:QzlnANU7
ruby始めたいんですが、テスト実行する時は毎回コマンドプロンプトでcd打ち込んでしこしこやるもんですか?
0141デフォルトの名無しさん2014/07/24(木) 22:53:34.81ID:mk/qqxYw
RubyはUNIX系のOSで使うもんだからコマンド使うのは当然
0142デフォルトの名無しさん2014/07/24(木) 23:23:04.40ID:TORgOaiD
>>140
OSX(Mac) なら、Finder 上のフォルダをターミナル画面へドロップすると、
そのフォルダの UNIX ディレクトリパスが入力される
だから、ターミナルでは cd とだけ打てばいい

あと Linux や OSX 等を含む UNIX の対話環境だと、シェルがディレクトリ名や
ファイル名を補完してくれるから、プロジェクトの構成が整理されていれば
先頭の数文字を打って後はシェルの補完に頼ることができる
だからタイピングが苦手でも、環境に慣れればそれほど苦痛とは感じなくなる(はず)
0143デフォルトの名無しさん2014/07/25(金) 00:24:45.92ID:M5DbZg9u
現在作って実行してみたいスクリプトは1つしかないだろうし、
1つしかないってことはそれが入ってるディレクトリは1つだけだろうし、
rubyコマンドに指定するファイル名も1つだけのはずである

つまり1回だけコマンドプロンプトを起動してファイル置き場に1回だけ移動して
ファイル編集したあと1回だけファイル名をrubyコマンドの引数に入力して実行すればいい
どれも1回だけだ
もういちど実行したい場合はコマンドプロンプトのヒストリ機能で呼び出してEnterすればよろしい
キーボードの上矢印で順番に出てくる

下手にマウスとか使おうとすると煩雑で死ぬのでキーボード使うこと
0144デフォルトの名無しさん2014/07/25(金) 00:40:14.11ID:mPXiIZE+
>>140
楽をしたいだけなら実行までできるIDEを使えば。

楽をするための苦労を厭わないなら、簡単にcdとかできる、しなくてもいい方法を考えたら。
いい勉強になるだろう。
0145デフォルトの名無しさん2014/07/25(金) 01:28:52.03ID:c73V3zd5
>>140
Windowsもコマンドプロンプトにフォルダをドロップすると
フルパスが入力されるので>>142と同じようなことができる

Rubyスクリプトを置くディレクトリで開くコマンドプロンプトの
ショートカットを作るとか、バッチでディレクトリ移動するという
手もある
0146デフォルトの名無しさん2014/07/25(金) 11:39:04.68ID:3IqFdEs5
俺はcmd起動するときの最初のパスが既にソースコードまとめてあるディレクトリになってる
言語問わずそこで作業
ちゃんと開発する時は普通に別ディレクトリで
0147デフォルトの名無しさん2014/07/25(金) 12:14:05.15ID:Yo6Sfo//
>>140
最近のウィンドウズ知らないけどコマンドプロンプトが
「処理終了したら閉じる」という設定になっているのでは?
閉じる設定でなければ毎回cdしなくてもいけるんじゃないかな
0148デフォルトの名無しさん2014/07/25(金) 12:18:27.19ID:WLh8J9pC
ダブルクリックしてるの鴨試練
0149デフォルトの名無しさん2014/07/25(金) 12:37:18.84ID:LKOgwVhO
使ってるエディタからコマンドプロンプトを起動すれば
編集中のファイルのパスを作業ディレクトリとして
コマンドプロンプトを起動してくれると思う
0150デフォルトの名無しさん2014/07/25(金) 13:11:43.10ID:hJipNkKC
Windowsなんだけどクソ便利なんだけどあまり知られていない機能なんだけど
エクスプローラで任意のフォルダ開いでのアドレスバーにcmdって打ち込むと
そのフォルダに移動した状態でコマンドプロンプトが開く
0151デフォルトの名無しさん2014/07/25(金) 13:13:04.77ID:hJipNkKC
別にcmdに限らずパスの通ったコマンドならなんでもいけるから
直接irbとか打ち込んでもok
0152デフォルトの名無しさん2014/07/25(金) 13:27:45.66ID:WLh8J9pC
>>150
ほんとだ
知らなかった
ありがとう
2ちゃんもたまには役に立つんだぬ
0153デフォルトの名無しさん2014/07/25(金) 13:29:21.50ID:WLh8J9pC
>>151
そのディレクトリで管理者権限で cmd 立ち上げられませんか?
0154デフォルトの名無しさん2014/07/25(金) 13:29:59.63ID:WLh8J9pC
ctrl+enter でもなんか起きるな
0155デフォルトの名無しさん2014/07/25(金) 13:31:44.65ID:WLh8J9pC
ruby と撃ち込んで ctrl+enter
0156デフォルトの名無しさん2014/07/25(金) 13:39:26.35ID:mmV7Js8i
MAKEFILEのあるフォルダで make とか打つとかっこいいな
0157デフォルトの名無しさん2014/07/25(金) 13:48:34.63ID:WLh8J9pC
pythonw は何も起きない
0158デフォルトの名無しさん2014/07/25(金) 13:49:32.42ID:WLh8J9pC
git push とかも可能か
0159デフォルトの名無しさん2014/07/25(金) 14:46:56.21ID:9RAl771B
うんち
0160片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 2014/07/25(金) 16:01:49.83ID:Snct3h9B
def f a,b
a = b
end

x = 1
y = 2
f x,y
p x,y #=>1,2

関数fの中でxを書き換えたいんだが、どうすんねん?
0161デフォルトの名無しさん2014/07/25(金) 16:55:52.79ID:5HeCUYeT
>>160
・配列に入れて渡し、配列を書き換える
・インスタンス変数ならば、オブジェクトごと渡して変更メソッドを呼ばせる
・そのメソッドがその場でしか使わないのであれば、ブロックにして外の変数を書き換える(ブロック突入前に存在しなければ初期値を入れておく)
・変更するくらいなら、戻り値として返す

Cと違って、多重代入もあるし配列だってHashだって戻せるんだから
無理して書き換える必要性は無く、返せば良いと思うぞ
01621232014/07/25(金) 18:20:34.37ID:7iMP+P1B
>>123-126
A(){
 変数a
 return B(){}
}

結局、クロージャ・ラムダ・匿名クラスなどは、
色々難しい名前を付けたが、クラスなんだよな

クラスAには、メンバ変数a, メンバ関数Bがあるだけ
0163デフォルトの名無しさん2014/07/26(土) 02:02:24.33ID:8QVtVKLI
ジャン・クロード・バンダム?(難聴
0164デフォルトの名無しさん2014/07/26(土) 02:46:01.98ID:zIbYZCVC
rubyとrubywのどちらで起動されたかをスクリプト側から判断するのってどうやるの?
0165デフォルトの名無しさん2014/07/26(土) 03:08:33.22ID:2fRRiDMt
argv[0]
0166デフォルトの名無しさん2014/07/26(土) 17:21:34.64ID:L52INrm9
Windows限定の話か?なら
WindowsAPIのGetModuleFilenameを叩くのが一番確実だ。
0167デフォルトの名無しさん2014/07/26(土) 18:07:18.57ID:2fRRiDMt
驚き最小の法則ω
0168デフォルトの名無しさん2014/07/26(土) 22:26:20.20ID:c/LX3X4p
Rubyは例外的なルールや非直感的な制限がとても多く、
驚き最小の原則なるものとは真逆を行く言語だよ
驚き最小ってPythonみたいなののことを言うんだよ
0169デフォルトの名無しさん2014/07/26(土) 22:40:13.26ID:+1COesfI
>>168

>>57
0170デフォルトの名無しさん2014/07/27(日) 01:09:12.69ID:YDU+iIQK
つーか驚き最小の法則なんてもう何年も使われていないし
0171デフォルトの名無しさん2014/07/27(日) 01:13:04.51ID:yFRKgWmm
二重の意味で頓珍漢な発言してて>>168ってほんと恥ずかしいな
0172デフォルトの名無しさん2014/07/27(日) 13:35:49.37ID:UMDAGQ8D
                         /       \
                       /     _    _ ',
                        _|     / ・ ヽ /・ ヽi
                        {       し―J し‐ J|
                        >‐ 、 「 ̄匚} ̄匚lい
             ,  -―‐< ̄ ̄ ̄ ̄\____    } }
            / ̄ ̄\___ `ヽ   /´  ハ   \//
          /         `ヽ |    |ニニニニ ′
            |    y         | |___j⌒ヽ
            |    |         7 |____/厶ノ
          \  ヘ         �h ∧_/
.             ヽ  ヽ       l_/
               ハ   ',     |`ヽ
          (__}__レ ――┴ァ′
.            Y⌒V⌒ヾヽ ー-|
            ! !   | { ー}
.            ヽ_ヽ_ヽ_〉‐''´
0173デフォルトの名無しさん2014/07/30(水) 21:35:33.47ID:ucnjA6/+
・Pythonを書き始める前に見るべきTips - Qiita
  http://qiita.com/icoxfog417/items/e8f97a6acad07903b5b0
  Pythonは何かとトラップが多い言語で、
  引っかかるとなんてゴミ言語と感じてしまうことが少なからずある

要するに Python への批判記事である訳だけど、
この記事の視点を Ruby に当てはめてみよう

・ファイルのエンコードを宣言する必要がある
 Ruby => Ruby 1.9 でこのゴミ仕様が取り込まれて危うかったけど、
  Ruby 2.0 ではデフォが UTF-8(Unicode) になってゴミを排除できた

・文字列には通常の文字列とユニコード文字列がある
 Ruby => Ruby では最初から(少なくとも Ruby 1.4 の時代から)一般的な文字列は
  多言語化に対応した String クラス、ただ一つだけしか存在していません

・割り算の結果がfloat型にならない
 Ruby => 「強い型付け」による動的型付け言語である Ruby からすれば、
  この指摘そのものが規約違反であって、1 / 3 は 0 で 3 / 2 は 1 になるのが自然であり、
  もしfloat型が必要であれば、たとえば 1.to_f / 3 のように明示的に型変換すべきと考えます

  おそらく著者は「弱い型付け」による動的型付け言語である JavaScript の経験が
  長いのでこのような不満を感じたのでしょう、JavaScript は Python 3 と同じ結果になります
    js> 1/3
    0.3333333333333333
    js> 3/2
    1.5
  そして、Python 3 は「弱い型付け」に向かって変化したのですから、
  次の Python 4 では、おそらく以下のような実行結果へと仕様改訂されることでしょう(棒
    >>> "A"+1
    'A1'
(長いので、一旦ここで切る)
0174デフォルトの名無しさん2014/07/30(水) 21:54:15.22ID:cG7xMHTs
それ書いた人の「強い型付け」「弱い型付け」の定義が間違ってる
0175デフォルトの名無しさん2014/07/30(水) 22:17:39.92ID:+YSZmqYf
演算子を適用した結果の型がどうなるかは演算子の仕様の問題に過ぎず
型付けの強い弱いは関係ない
演算の自動リフトや型変換なんてC系の言語では普通にあることで
動的型言語ではそのルールの適用をコンパイル時ではなく実行時の型に応じて動的に行ってるだけ
また、JavaScriptに整数型は仕様上ない
0176デフォルトの名無しさん2014/07/30(水) 22:45:41.48ID:+YSZmqYf
演算による自動型変換が問題になりうるのは、次の両方を満たす場合だ。
・オペランドや結果の型が静的に決まらない
・オペランドの型によって演算子の意味が変わる
例えば、JavaScriptは実行してみなければ+が加算になるのか文字列連結になるのか分からないでしょ。
そういう性質を便宜的に「型付けが弱い」と表現することがある。
その観点では1.0/3と1/3で結果が同じになるPython3の仕様の方が「型付けが強い」と考えることもできる。
0177デフォルトの名無しさん2014/07/30(水) 23:33:27.95ID:cG7xMHTs
> 便宜的に「型付けが弱い」と表現することがある。

ない。きちんと意味が定義されてる言葉を俺様意味付けして使うな。

> その観点では1.0/3と1/3で結果が同じになるPython3の仕様の方が「型付けが強い」と考えることもできる。

デタラメな足場の上からの観点ですね。
0178デフォルトの名無しさん2014/07/30(水) 23:43:44.39ID:ucnjA6/+
・新スタイルクラスと旧スタイルクラスがある
 Ruby => CLOS や Smalltalk と同様な動的型付け/動的メソッド束縛方式の
  オブジェクト指向言語として設計されたRubyのクラス定義スタイルは、
  最初から(少なくとも Ruby 1.4 の時代から)変更がありません

  Python に関しては、もともと手続き型言語として設計されたものに後から
  オブジェクト指向を付け足す際、開発チームの「オブジェクト指向への理解不足」によって
  静的型付け/静的メソッド束縛言語のオブジェクト指向を導入したという「過ち」がありました
  結果として、リフレクションを多用する最近のメタプログラミング・スタイルに追従できず、
  旧スタイルを排除して新スタイルに「改めざるをえなかった」のだと思われます

・コンストラクタ(と思われるもの)が2つある
 Ruby => 最初からオブジェクト指向言語として設計された Ruby では、
  コンストラクタは Class.new、イニシャライザは Object#initialize と
  明確に区別されていますから、「可読性に劣る Python 」のような混乱はありません

・PrivateやProtectedがない
 Ruby => Ruby にはメソッドの可視性を指定する private や protected があります
  (ただし、個人的にはこれら可視性を宣言するよりも、public メソッドの名前の
   前(または前後に) '_' あるいは '__' を付けるスタイルを好みます )
  また Ruby には名前の先頭に付ける '_' や '__' について、言語としての「強制」は無く、
  命名スタイルはプログラマの判断に委ねられています

・メソッドの第一引数が予約されている
 Ruby ==> 最初からオブジェクト指向言語としている Ruby では、(コードが self だらけに
  なってしまう)「Python のような冗長で可読性に劣る規約の強制」はありません
  Smalltalk と同様に、メソッド呼び出し先として自身を「明示したい時にだけ」
  疑似変数 self を、親クラスを「明示したい時にだけ」疑似変数 super を書くだけです

(まだ続くが、次で終わる予定)
01791732014/07/30(水) 23:55:37.21ID:ucnjA6/+
書き忘れたけど、>>178 は >>173 の続きです
0180デフォルトの名無しさん2014/07/31(木) 00:06:25.30ID:I9wcB7pD
何でRubyで可視性使わないんだ?
擬似privateで実質protectedの特殊形、なprivateはともかく
protectedとpublicは普通に使うと思うんだが…
0181デフォルトの名無しさん2014/07/31(木) 00:41:24.92ID:IjpkEocs
>>180
これがやってること見ればわかるだろ、愚問
01821732014/07/31(木) 01:25:29.27ID:h0+6R2oI
(>>178 の続き)
・メソッドのオーバーロードができない
 Ruby => (Python や JavaScript と同様に)動的型付け言語である Ruby では、
  引数のデータ型を実行時に判別(イントロスペクション)できるので、
  メソッドのオーバロード(多重定義)は「必須ではない」と思います

・ファイルで名称空間が切られる
 Ruby => Ruby ではモジュール宣言を使って名前空間が切られますから、
  ファイルと名前空間との一致という「規則を強制する Python」とは異なり、
  名前空間というプログラムの階層的な論理構造と、ファイル/ディレクトリという
  プログラムの階層的な物理構造をプログラマが自由自在に表現できます

・for文にindexがない
 Ruby => これも >>173 にある「割り算の結果」の項目と同様に、著者がC言語風の
  indexを伴うfor文がある JavaScript の経験が長いので、不満に感じるのだと思われます
  Ruby だと、index を伴う反復を以下のように書きます
    list.each_with_index do |index, value|
      puts "index:" + index.to_s
    end
  また Ruby 1.9 からは Enumerator オブジェクトとメソッド with_index が追加されたので、
  関数型プログラミングのスタイルでコードを書くこともできるようになりました
    puts list.each.with_index.map { |index, value| "index:" + index.to_s }

・配列/リストの長さはlenでとる
 Ruby => 最初からオブジェクト指向言語として設計されているので、
  配列の長さを求めるにはメソッド Array#length を使って list.length と書けます
  これについては、すでに >>57 で解説しているので、ここでの詳細は省略します

(これで終わり、ここまでの連投カキコに対するレスは、明日になる)
0183デフォルトの名無しさん2014/07/31(木) 01:33:39.66ID:YSTj81JP
Rubyのアクセス制御は継承が絡まないから考え方がシンプルだと思うけどな
01841732014/07/31(木) 21:19:14.83ID:h0+6R2oI
>>174
間違っていると思うなら、具体的な説明を
感情的な反発だけでは、自ら敗北を認めたのと同じ
01851732014/07/31(木) 21:59:08.98ID:h0+6R2oI
>>175
まず「JavaScriptに整数型は仕様上ない」という指摘は正しい
(ボケへの的確なツッコミが嬉しい)
ただし、それ以外の部分はメチャクチャだね

> 演算子を適用した結果の型がどうなるかは演算子の仕様の問題に過ぎず
> 型付けの強い弱いは関係ない

演算子(= 関数 or メソッド)の適用結果のデータ型が曖昧である事を許容する言語は、
曖昧なデータ型を禁止する言語と比較して「型付けが弱い」と呼ばれる

たとえばC言語では戻り値が「ある(オブジェクトへのポインタ) または NULL」という仕様の
関数定義を許すけど、ML や Haskell のような型付けに厳格な言語では型エラーとして
定義できず、代わりに直和型(ML ならOption型、Haskell ならばMaybe型)を使う
この対比のケースだと、C は ML や Haskell よりも「型付けが弱い」となる

つまり、データ型に関する仕様の曖昧さを認めるか否かという言語の設計方針は、
「型付けの強さ弱さ」を決める要因の一つである、ってこと

> 演算の自動リフトや型変換なんてC系の言語では普通にあることで

そういった「暗黙の型変換(implicit conversion)」あるいは「型強制(coercion)」と
呼ばれる仕掛けはプログラミングを楽にする効果がある一方で、
その多用は型検査の能力を阻害する悪影響がある
だから、それらを許可しない型付けに厳格な言語との対比として、
C言語系は「型付けが弱い」と呼ばれる
01861732014/07/31(木) 22:43:50.19ID:h0+6R2oI
>>176
>演算による自動型変換が問題になりうるのは、次の両方を満たす場合だ。

発想の方向性は正しいと思うから、思考をもう一歩先に進めよう
言い換えると、「型が静的に決まらない」や「型によって演算子の意味が変わる」といった
要因は、どのような効果を導くのか?を考えてみよう、ってこと

その答えは、プログラマの(データ型に関する)誤り(=エラー)を見逃す可能性を増やす、
簡潔に言えば「型検査の能力を阻害する」ってこと
たとえば JavaScript のコード "A"+1 は、プログラマが "A1" が返る事を意図していたなら
正当で簡潔なコードだけど、もしもうっかり "1" をタイプミスしたとしたら
JavaScript処理系はミスの検出を見逃して最終的に予期しないバグとなる可能性がある

この「プログラマの表現力への制約を極力減らしつつ強力な型検査能力を提供する」ことは、
型体系(type system)の研究における重要な動機の一つになっている

> その観点では1.0/3と1/3で結果が同じになるPython3の仕様の方が
>「型付けが強い」と考えることもできる。

上で述べたように、型付けの強さ弱さとは、一般には型検査能力の程度を指す
(ただし「型検査」そのものが広い概念を指す曖昧な言葉であることに注意が必要)
このような「1.0/3と1/3で結果が同じになる」という、計算結果の同値性が
型付けの強さ弱さを決めるなどという珍説は、これまで見たことも聞いたことも無い

型付けの強さ弱さに関しては、Wikipedia に良くまとめてあるので、勉強されることを勧める
・Strong and weak typing - Wikipedia, the free encyclopedia
 http://en.wikipedia.org/wiki/Strong_and_weak_typing
0187デフォルトの名無しさん2014/07/31(木) 23:09:22.53ID:cjUptmKw
Javaなどの静的言語では一般的な"A"+1がRubyやPythonでなぜ許されないのかわかってる?
実行時まで動作や結果の型が決まらない曖昧さを避けるためだよ。
静的言語では曖昧さは残らないから問題ないわけ。
結果の型が曖昧であることをなるべく許容しないのであれば
「動的言語なら」/演算子は常にfloatを返す仕様の方が曖昧さは少ないだろう。
01881732014/07/31(木) 23:18:05.47ID:h0+6R2oI
>>180
おそらくコードの可読性というか視認性が要因だろね
メソッド名の頭に '_' または '__' が付いていれば、
「それは public じゃないから触っちゃ嫌よ」あるいは
「もし使いたいなら事前に仕様を十分に確認してね」
といったコードの意図が一目でわかる

また、1つクラス定義をできるだけ小さくしようとする
小クラス主義で設計することを考えているから、
スーパクラス-サブクラス間でメソッドを介して関連し、なおかつ
そのメソッドの外部からの利用を(protectedで)禁止するのが
望ましいというケースがほとんど無い(ちょっと思いつかない)
というのも理由かもしれない

最後に、実行前に違反を検出できないアクセス制御に
いったい何の価値があるの?という率直な疑問もあったりする
これはアクセス制御という発想が全く存在しない Smalltalk の影響を
受けているからではないかと思う

とはいえ、こうして指摘される迄、何も疑問に感じていなかった訳だから、
可視性(アクセス制御)の活用も今後は見直すかもしれない
01891872014/07/31(木) 23:39:16.07ID:cjUptmKw
>>187はRubyが劣っていると言いたいわけじゃない。
1.0/3と1/3で結果が変わるのは多態性として考えれば当然。
この問題に限っては、Rubyは型検査の能力を犠牲にして
オブジェクト指向言語としての一貫性を重視しているということだ。>>185の理屈に従えばね。
01901732014/07/31(木) 23:54:45.04ID:h0+6R2oI
>>187
>結果の型が曖昧であることをなるべく許容しないのであれば
>「動的言語なら」/演算子は常にfloatを返す仕様の方が曖昧さは少ないだろう。

もしも Python 3 に「演算子の左辺の型に関わらず結果値の型は一つに決まるべき」
という設計方針/哲学があり、それを演算子 / に適用して「左辺が整数と小数の
いずれでも計算値は小数を返すのが(曖昧さが無いから)正しい」としたのなら、
その主張の正当性を認めよう
  >>> 1/2
  0.5
  >>> 1.0/2
  0.5


では次にもう一つの演算子 // について試してみよう
  >>> 1//2
  0
  >>> 1.0//2
  0.0
あれ、おかしいな?左辺の型によって戻り値が整数になったり小数になったりしている
もしかすると、Python には一貫した設計方針/哲学なんて高尚なものは存在せず、
演算子の種類によってコロコロ方針を変える(大人の汚い)やりかたが正しいと考えているのかな?
01911732014/08/01(金) 00:01:31.80ID:3wJnlar9
>>189
つまり >>190 を前提とすれば、
「オブジェクト指向言語ではない Python では一貫性を重視しない」
ってこと?

まあ Python の一貫性の無さは >>57 でも指摘しているし、
Python に慣れてしまうと、設計方針の一貫性なんてものは
気にすべきでは無い些細な事柄なのかもしれないね
01921872014/08/01(金) 06:46:07.72ID:J39fVXGB
>>190
だから言語そのものの優劣を主張してるわけじゃないって言ってるだろ煩い奴だな
元はといえば演算子の仕様一つで型付けが強い弱いだのと決め付けようとしたのは自分自身でしょ
主張の矛盾を指摘してるだけ
0193デフォルトの名無しさん2014/08/01(金) 07:03:34.19ID:pb6Sjbuz
PythonはPEPの存在がありがたかった。
開発ポリシーやサポート期間が明文化されていないってのは
採用にあたっての大きな障害になるからな。
言語設計の些末なんぞ経営者や顧客にとっては何の魅力もない。
0194デフォルトの名無しさん2014/08/01(金) 07:05:32.23ID:EwadhP/C
今日も暑いな
0195デフォルトの名無しさん2014/08/01(金) 07:11:54.53ID:VcCQb1qo
うんこ我慢中
というか出そうなのに出ない
0196デフォルトの名無しさん2014/08/01(金) 10:29:41.65ID:wXpsznL9
> 型付けの強さ弱さに関しては、Wikipedia に良くまとめてあるので、勉強されることを勧める
> ・Strong and weak typing - Wikipedia, the free encyclopedia
>  http://en.wikipedia.org/wiki/Strong_and_weak_typing

日本語版の「型システム」の記事のほうが正確に書いてあるね。
正確な定義と、編集者の主観とかによる内容が怪しげな議論が、きっちり分けてある。
そっちで正しい勉強をされることを勧める。
0197デフォルトの名無しさん2014/08/01(金) 15:14:38.77ID:YS2dfwIg
超初心者です
OSXでdxrubyを使うためにdxruby_sdl導入したいのですが英語に疎すぎてgithubに書いてある説明がよく分かりません
少しだけでも手をお貸しください
01981732014/08/01(金) 21:43:31.89ID:3wJnlar9
>>189
> 1.0/3と1/3で結果が変わるのは多態性として考えれば当然。

たしかに(型付けの強弱よりも)多態性で解釈するのが、
Ruby では素直というか自然な発想ですね

しかしながら、

> この問題に限っては、Rubyは型検査の能力を犠牲にして
> オブジェクト指向言語としての一貫性を重視しているということだ。>>185の理屈に従えばね。

という箇所に関しては、結果が変わる現象を多態性で説明できてしまうのですから、
この演算子の左辺に着目するケースに限れば、
「型検査の能力を犠牲にしている」という指摘は間違いであると考えます

型検査(つまり型付けの強弱)が問題になるのは、
「1.0 / 3.0 と 1.0 / 3 で結果が同じになる」という演算子の右辺に着目するケースです
Ruby の数値系クラスでは、(単なる型判定ではなく)「型強制(coerce)アーキテクチャ」と呼ばれる
設計方針に従った一貫したインターフェイスを提供していますが、
(>>185 の最終段落で述べたように)型強制には型検査の能力を阻害する悪影響があります

したがって、もし犠牲という言葉を強調したかったのであれば、
「今回のケースは無関係であるが、1.0 / 3.0 と 1.0 / 3 で結果が同じになるケースでは、
 Rubyは型検査の能力を犠牲にして型強制の利点を重視している」という指摘が正しいと言えます

なお、型検査の能力を犠牲にしているとはいえ、「1.0 / 3.0 と 1.0 / 3 で結果が同じになる」のは
Python も同じなのですから、動的型付け言語である Ruby の設計方針としては妥当な判断でしょう
01991732014/08/01(金) 21:51:58.88ID:3wJnlar9
>>192
>>190 では、型付けの強弱について頓珍漢な我流解釈をしていた >>175,176 と
同一人物であると早合点し、>>189 の多態性という言葉を十分に検討しないまま
即レスしていました
冷静に考えると、ここは Ruby スレなのですから、>>190 はスレ違いなレスでした
気分を悪くさせて申し訳ありません
0200デフォルトの名無しさん2014/08/01(金) 22:08:57.71ID:02heIdPz
rubyだと良い感じのCGUIツールないって話がスレの最初の方に書いてあったけど、
高級スクリプト言語(?)で使える、マルチプラットフォームのGUIツールキットで一番よいのはなんでそ?
0201デフォルトの名無しさん2014/08/01(金) 22:09:39.65ID:3wJnlar9
>>197
超初心者という甘えで有識者にエスパーを期待しようとしても
ムリゲーだよ

どこがどう分からないかを説明しなければ、
誰もアドバイスできないと思う
たとえば

  「..... をしようとして ..... ではないかと考え、
   ..... という結果を期待して ..... を試してみたけど、
   ..... というエラーメッセージが返されて失敗しました」

といった文章を書いてみよう
0202デフォルトの名無しさん2014/08/01(金) 22:53:02.21ID:7R/51h0c
>>200
gtkでいいんじゃないの。
0203デフォルトの名無しさん2014/08/01(金) 23:13:00.33ID:YS2dfwIg
>>201
ご指摘ありがとうございます。以後気を付けます。
まずhttps://github.com/takaokouji/dxruby_sdlのREADME.mdを見ながら
ターミナルでSDLとSGEのインストール?を試みました。
SDLは問題なく完了し、次にSGEをインストールするとき8行目の[make]コマンドを実行しようとすると
fatal error: 'freetype/freetype.h' というエラーが発生しました。
なのでfreetypeというものをダウンロード?すれば良いのかと思い、
http://freetype.sourceforge.net/index2.html
ここでダウンロードしてもう一度コマンドを打ちなおしたのですが結果変わらず失敗しました。
0204デフォルトの名無しさん2014/08/02(土) 00:15:20.50ID:UBZX0AEK
>>203
すべてをソースからビルドしようとしているみたいだけど、
普通は「パッケージ管理システム」という仕組みを利用する
OSX なら、Homebrew (または MacPorts)になる
 (1) GitHub 等で公開されるオープンソース・プロジェクトでは、
  まず最初に作者様がソースからビルドする手順を公開する
 (2) そしてプロジェクトの提供するソフトウェアに人気が出て
  インストールを試す人が増えてくると、ソースからのビルドは面倒なので
  有志の誰かさんが Homebrew のようなシステムで扱えるように
  パッケージを作って登録する
 (3) そうすると、以降はインストールを試そうとする多くの人達が幸せになる
だから、まずは Homebrew を調べて基本操作ができるようになるまで慣れるのが先決
新Mac板に Homebrew 専用スレがあるので、そちらを頼ることも考えよう

なお、"sdl sge ruby mac" でググると、こんなブログ記事が見つかった
・noanoa 日々の日記 : Mac に Ruby/SDL、rsdl、SGE を入れて、MyGame ゲームライブラリを動かす
 http://blog.livedoor.jp/noanoa07/archives/1919322.html
この記事でも Homebrew を使っている
他の記事でもいいし、とにかく作業に着手する前に
ネットで情報収集する感覚を身につけたほうがいいと思う

少なくとも FreeType は有名なライブラリなので、
Homebrew を含む大半のパッケージ管理システムでも利用できる
あと SDL と SDL周辺ライブラリも公式パッケージが利用できるみたい
そして SGE には非公式パッケージが存在するような情報があるね(->Homebrewスレへ Go!!)
 
0205デフォルトの名無しさん2014/08/02(土) 00:21:35.21ID:Q0DxGqPm
Integer.methods.each do |name|
if name =~ /\?/
p name
end
end

Integerクラスのメソッドで?が付いている物を取り出すプログラムです。
これは配列の中で正規表現に一致するデータを取り出したいのですが。
もっとスマートに描けないでしょうか?
0206デフォルトの名無しさん2014/08/02(土) 00:41:59.29ID:PqERPQ+S
とりあえず、なにをどう小細工しても
「コレクションを最初から最後まで見て、マッチするものをなんらかの手段でひとつずつ探している」
であることはどうにもならない
たとえなにか「カッコイイ」メソッドがあったとしても、やってることは同じである
ということで
puts Integer.methods.find_all{ |x| x =~ /\?/ }
0207デフォルトの名無しさん2014/08/02(土) 01:01:31.31ID:k+09BHkd
キモい実装を目指すなら
p Integer.methods.select(&/\?/.method(:=~))
0208デフォルトの名無しさん2014/08/02(土) 01:15:53.60ID:sO72E4hr
method の引数になんか泳いでて最高にキモいです(賛辞)
0209デフォルトの名無しさん2014/08/02(土) 01:30:11.06ID:fLjR5gdB
正規表現で行頭にマッチしたいんけど、
入力文字列の改行コードが¥rとか¥nとか¥r¥nとか色々あるんだけど、
正規表現のアンカーの^って行頭にマッチすると言っても¥nで判定してるから
¥rとかでマッチしてくれないよね

改行コードのバリエーションごとの処理は自分でやらなきゃいけないの?
それとも改行コードといえば¥nがデフォとかそういうこと?
0210デフォルトの名無しさん2014/08/02(土) 01:48:07.49ID:qRelH0Iu
fatal errorだけじゃ、原因がわからん

makeする時に、もっと詳細を表示する、
オプションを付けて、やり直せ
0211デフォルトの名無しさん2014/08/02(土) 02:04:35.51ID:qRelH0Iu
>>209
JavaScriptの正規表現では、
改行が\r\n、\nのどちらでも結果は同じになるけど

通常は気にしなくてもいいと思う
0212デフォルトの名無しさん2014/08/02(土) 02:18:58.04ID:LjQ2kKfu
>>202
見てみたら簡単なのはこれで大丈夫そうですね・・・
ダサいのはマルチ環境だから贅沢言えないか
02132112014/08/02(土) 02:21:00.11ID:qRelH0Iu
あっ、改行が\rは、Mac OS9以前だね
それは知らない
0214デフォルトの名無しさん2014/08/02(土) 02:58:10.97ID:PqERPQ+S
>>209
改行コードではない
改行文字だ

文字だ

ただの文字だ

以上
0215デフォルトの名無しさん2014/08/02(土) 03:30:01.16ID:fLjR5gdB
>>214
0x0Dと0x0Aって言えばよかったのかェ
0216デフォルトの名無しさん2014/08/02(土) 08:09:12.14ID:gDjKnomp
'\r' は '\x0d' であることが保証されてるけど
'\n' は '\x0d\x0a' だったり '\x0a' だったりするのは
どうしてなぜ?
0217デフォルトの名無しさん2014/08/02(土) 08:11:05.08ID:u0m+qxIa
>>212
よいの定義を先にはっきりしとけよ。
0218デフォルトの名無しさん2014/08/02(土) 08:43:56.31ID:bMAcdfxk
もしかして:binmode
0219デフォルトの名無しさん2014/08/02(土) 11:07:24.06ID:+3sKWHZp
$ ruby --version
ruby 1.9.3p545 (2014-02-24) [i386-cygwin]

の環境で

p Time.now

したときに

2014-08-02 10:51:50 +73956

と出力されます.この +73956 とは何でしょうか?
これ邪魔なので出力させたくないのですが方法はありますでしょうか?
0220デフォルトの名無しさん2014/08/02(土) 12:04:41.50ID:gDjKnomp
microsecond
0221デフォルトの名無しさん2014/08/02(土) 19:14:45.58ID:mjAOYCs+
>>219
Time#inspectを上書き
0222デフォルトの名無しさん2014/08/02(土) 21:52:37.10ID:k+09BHkd
面倒でも毎回strftime呼んだほうがいい
0223デフォルトの名無しさん2014/08/02(土) 22:01:30.81ID:UBZX0AEK
>>219
Time.now.to_s.each_char.take(19).join # 先頭から19文字だけ取り出す

>>221 の言うように inspect を上書きするなら、以下のように定義する

class Time
  def inspect
    self.to_s.each_char.take(19).join
  end
end

実行例:
irb(main):001:0> class Time; def inspect; self.to_s.each_char.take(19).join; end; end
=> :inspect
irb(main):002:0> Time.now
=> 2014-08-02 21:58:27
irb(main):011:0>

ただし標準クラスの振る舞い(仕様)を変更するのだから、
むやみに用いるべきではない
0224デフォルトの名無しさん2014/08/02(土) 22:06:02.20ID:GQoYmdoX
こ汚ねぇと思いました
0225デフォルトの名無しさん2014/08/02(土) 22:12:10.95ID:rVz3fll6
Ruby初心者です。一つ質問していいですか?

Rubyには、JavaでいうところのTomcatみたいな
「アプリケーションサーバー」のようなものってありますか?
0226デフォルトの名無しさん2014/08/02(土) 22:16:48.29ID:GQoYmdoX
jrubyで使えるじゃん
0227デフォルトの名無しさん2014/08/02(土) 22:21:39.66ID:rVz3fll6
そんなソフトがあるんですね
勉強になりました。
ありがとうございました。
0228デフォルトの名無しさん2014/08/02(土) 22:39:34.17ID:UBZX0AEK
>>225
標準ライブラリの WEBrick を使うと、
Java でいうサーブレットは簡単に書ける
・Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > webrickライブラリ
 http://docs.ruby-lang.org/ja/2.1.0/library/webrick.html
リクエストされたURLに対応したファイルを読むだけの
サーブレット(ファイル・ハンドラと言う)も最初から用意されているから、
簡易Webサーバ(httpd)は超簡単に書ける

もっと手軽にWebサービスを書くのなら、
Sinatra というサードパーティ製のライブラリもある
"ruby sinatra 入門" あたりでググると解説が見つかる

なお、本格的なWebサービス開発を考えているなら、
Ruby on Rails を検討したほうがいいと思う
0229デフォルトの名無しさん2014/08/03(日) 06:53:33.60ID:P9e0hA8O
>>205
p Integer.methods.grep(/\?/)
0230デフォルトの名無しさん2014/08/03(日) 09:57:56.78ID:saA9+Ea3
>>219
Rubyのpはそのオブジェクトのinspectメソッドというものを呼び出している
inspectは「検査する」「(刑事などが)詳細に調べる」という意味で、
このメソッドはそのオブジェクトの内容を文字として表示するための情報源として使う
たとえばTimeオブジェクトは"2014-08-03 09:41:57 +0900"のような文字列として存在しているわけではなく、
「なんかよくわかんないけど変数とかメソッドとか入ったバイナリみたいなやつ」として存在している
これを直接画面表示しようとするとしんどいので、画面に表示するときにどう表示するかをオブジェクトのクラス製作者が適度に設定している

次、Rubyのpメソッドは前述のようにinspectを呼び出している
pメソッドはデバッグ用メソッドで、スクリプト作成中などにオブジェクトの内容を確かめるために使用される

オ ブ ジ ェ ク ト を 第 三 者 ユ ー ザ ー に 表 示 す る た め の メ ソ ッ ド で は な い

ので、もしオブジェクト内容を綺麗に表示させる必要があるのなら、
(存在すれば)整形メソッドを利用し、文字列を自前で作ってputs等を使用「しなければならない」
いまだに「pは画面表示用のメソッド」「pはputsの省略形」という解説をしてる本やサイトがあるが、燃やして捨ててしまってよい
Timeオブジェクトを特定の書式で表示したい場合は>>222

irb> puts Time.now.strftime('%Y-%m-%d %H:%M:%S')
2014-08-03 09:53:28
0231デフォルトの名無しさん2014/08/03(日) 14:20:20.23ID:T59meZIw
ISO format って
2014-08-03T09:53:28
という風にTが入るのはなぜ?
0232デフォルトの名無しさん2014/08/03(日) 14:25:58.16ID:Uv66z7PH
>>231
ISO8601か。数字が続くと区切りにくいし、スペースはいろんなとこで区切り記号として使われているからじゃないか。スラッシュやハイフンも日時ではいろんな使われ方してるし。
■ このスレッドは過去ログ倉庫に格納されています