5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Ruby 初心者スレッド Part 32

1 :デフォルトの名無しさん:2009/10/24(土) 06:18:12
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。)
 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。

関連スレや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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

952 :デフォルトの名無しさん:2009/12/04(金) 10:40:53
>>951
Rubyスタイルってなんですか?

953 :デフォルトの名無しさん:2009/12/04(金) 11:09:21
snake_case という言葉を知らないんだろうな

ぜんぜん一般的じゃないから知らない人のほうが多いが
俺も CamelCase なんかとの比較列挙のときしか使わん
「アンダースコア区切り」で一発で伝わるし

954 :デフォルトの名無しさん:2009/12/04(金) 11:10:30
ライブラリの単純なラッパー作るときはsayHelloのままにして、Rubyっぽいライブラリにする時にsay_hello

955 :デフォルトの名無しさん:2009/12/04(金) 12:15:25
>>939
ちょっと短いソースに挑戦してるとこだったので関数の形がよかったんです
ないのは残念
[゙゙,1] - [゙゙]これで我慢しときます

956 :デフォルトの名無しさん:2009/12/04(金) 13:20:36
snake_caseってハンガリアン記法のことじゃないの?

957 :デフォルトの名無しさん:2009/12/04(金) 13:24:29
いや全然

958 :デフォルトの名無しさん:2009/12/04(金) 13:30:37
ハンガリアン記法はハンガリアン記法でいいじゃないか
名前あるんだし

959 :デフォルトの名無しさん:2009/12/04(金) 15:37:37
[1,2,3,4,5].inject(0) {|result, item|
p result += item
}
こんな事が出来るイテレータって無いですか?


こんなのつくったんですが、なんか不恰好なので
class Array
  def letmap *h
    self.map do |m|
      yield m , h
    end
  end
end
[0,0,0].letmap(8) do |c,ph|
  p ph[0] += 1
end

960 :デフォルトの名無しさん:2009/12/04(金) 18:17:52
endが目立つなあ

961 :デフォルトの名無しさん:2009/12/04(金) 18:26:17
無理っぽいですね
replaceによる書き換えしか手段がないかも

962 :デフォルトの名無しさん:2009/12/04(金) 19:41:37
String文字列をRegexpにする関数ってないですか?

963 :sage:2009/12/04(金) 19:52:06
[1,2,3,4,5].inject(0) {|result, item| p result += item; result } こう?

964 :デフォルトの名無しさん:2009/12/04(金) 19:59:13
>>962
リテラルではなくてRegexpのコンストラクタ使うといいよ

965 :デフォルトの名無しさん:2009/12/04(金) 20:02:22
compile

966 :デフォルトの名無しさん:2009/12/04(金) 20:07:03
str = "hoge"
Regexp.new(str)
Regexp.compile(str)
/#{str}/


967 :デフォルトの名無しさん:2009/12/04(金) 20:07:28
Stringで与えられた正規表現をRegexpオブジェクトにするなら
Regexp.new(str)か/#{str}/
Regexp.compile(str)はnewの別名だから好みで

メタ文字がエスケープされていない「正規表現ではない」文字列を
RegexpオブジェクトにしたいならRegexp.escape(str)

968 :デフォルトの名無しさん:2009/12/04(金) 20:10:10
俺はRegexp.quoteのほうをよく使うな

969 :デフォルトの名無しさん:2009/12/04(金) 20:23:36
>>967
ありがとうございます
Regexp.new使います

970 :デフォルトの名無しさん:2009/12/04(金) 20:26:25
escape はエスケープするだけで、返されるのは String 。
Regexp オブジェクトにするにはそれをさらに Regexp.new なりなんなりしないと。

971 :デフォルトの名無しさん:2009/12/04(金) 20:27:37
>>963
injectは戻り値を置いておかなきゃいけないのが嫌なので作ろうとしてました
やっぱ引数には配列か構造体か関数でも渡さないとダメかなぁと

972 :デフォルトの名無しさん:2009/12/04(金) 20:36:56
>>970
そうだったthx

973 :デフォルトの名無しさん:2009/12/04(金) 21:14:28
injectはtapとの共用オススメ

(1..10).inject({}) { |r, x| r.tap { |e| e[x] = x ** 2 } }

え、面倒くさい?ですよねー

974 :デフォルトの名無しさん:2009/12/04(金) 22:10:00
質問です。
引数として受け取ったブロックを使って自身の特異メソッドを定義するメソッド、は
どのように書いたらよいでしょうか?

def define_singleton_method(sym, block)
class <<self
define_method(sym, block)
end
end

だと、スコープの関係で sym や block が見えなくなるし
文字列にして eval に渡すという方法だと block が渡せなくて困っています。

975 :デフォルトの名無しさん:2009/12/04(金) 22:13:31
>>971
合計だけなら、[1,2,3,4].inject(:+) でいいけど、ちょっと処理を作り込む時に悩むよなあ。

976 :デフォルトの名無しさん:2009/12/04(金) 22:25:43
class Object
  def define_singleton_method(name, &block)
    (class << self; self; end).send(:define_method, name, &block)
  end
end

x = Object.new
x.define_singleton_method(:hello) { |name| puts "hello, #{name}" }
x.hello('>>974')

#=> hello, >>974


977 :974:2009/12/04(金) 22:31:24
>>976
おお、ありがとうございます!
そういう self の取得方法があるとは、全然気付きませんでした。

そっか、class...end も式で、最後に評価した値を返すんでしたね。
助かりましたっす。


978 :デフォルトの名無しさん:2009/12/04(金) 22:32:34
p Array.new(5) {|i| i } # => [0, 1, 2, 3, 4]

この0とか1はどこから出てくるのでしょうか?
iってnilじゃないの?

979 :デフォルトの名無しさん:2009/12/04(金) 22:35:34
インデックス(添え字)だよ。

980 :デフォルトの名無しさん:2009/12/04(金) 22:41:36
Array.new(size) {|index| ... }
って、|i|にはindexが入る「決まり」なのか。

981 :デフォルトの名無しさん:2009/12/04(金) 22:43:25
各要素のインデックスを引数にしてブロックを実行。
その評価結果を対応するインデックスの値とする。

p Array(5) {|i| i ** i}
=> [1, 1, 4, 27, 256]

982 :デフォルトの名無しさん:2009/12/04(金) 23:49:26
>>978
def yussu n
h = []
n.times do |index| h.push yield(index) end
h
end
p Array.new(5) {|i| i } # => [0, 1, 2, 3, 4]
p yussu(5) {|i| i }

983 :デフォルトの名無しさん:2009/12/04(金) 23:52:46
「ゆっす」って何

984 :デフォルトの名無しさん:2009/12/05(土) 00:22:29
ンデュールじゃね

985 :デフォルトの名無しさん:2009/12/05(土) 03:18:49
gem install hogehoge



ERROR: While executing gem ... (Gem::RemoteSourceException)
  HTTP Response 403

になるの俺だけ?
ぐぐっても「どうにもならんから新しいgemを手動でインストールした」
って感じのBlogがあっただけだったけど

>>682は解決したの?

986 :デフォルトの名無しさん:2009/12/05(土) 07:58:23
>>985
しばらくしたらたまに落ちます

987 :デフォルトの名無しさん:2009/12/05(土) 09:11:07
>>985
そういうのを書くときは gem -v と gem env の結果を書け。
たぶんおそらくきっと gem のバージョンが古いだけ。


988 :デフォルトの名無しさん:2009/12/05(土) 09:28:10
gemのリモートソースのurlって変わった?

989 :デフォルトの名無しさん:2009/12/05(土) 11:09:40
h = {"a" => 1, "b" => 2, "c" => 3}
p h

は問題ないのですが、

p {"a" => 1, "b" => 2, "c" => 3}

がsyntax errorになるのは何故でしょうか?

990 :デフォルトの名無しさん:2009/12/05(土) 11:32:17
ブロックの始まりの { と勘違いしてるとかじゃまいか

irb(main):010:0> p{|e|'a'}
=> nil

マニュアルにはなぜこうなるかは書かれていない悪寒

991 :デフォルトの名無しさん:2009/12/05(土) 11:33:35
>>989
[1,2,3].each{"a" => 1, "b" => 2, "c" => 3}

これがエラーになるのと同じ理屈
p の引数にカッコ省略でハッシュリテラルが来てると思われてるんではなく、
p がブロックつきメソッドで、その中に文法上不正なよくわからんコンマ並びデータがあると思われてる

p({"a" => 1, "b" => 2, "c" => 3})

と引数カッコを明示するしかないな

992 :デフォルトの名無しさん:2009/12/05(土) 11:38:50
あ、書いてあった。Ruby用語集より

> ブロック付きメソッド呼び出し
> コードの集まり(ブロック)を受け取ることのできるメソッドをブロック付きメソッド呼び出しと呼ぶ。
>
> ブロック付きメソッドの中ではyieldを使ってブロックを実行することができる。
> 当然のことながら、与えられたブロックをどのように処理するかはメソッド側に委ねられている。
> ので、***内部でブロックを評価しないメソッドにブロックを与えてもなにも起きない。エラーも起きない。***

993 :デフォルトの名無しさん:2009/12/05(土) 11:57:52
なるほどね良く気がつくなあ
質問者じゃないが納得した

省略可能なことが多すぎて優先順位とか知りきれてないことが多いなあ
実は優先順位が関わるあいまいな表現になってても
記述者(自分)としてはあいまいにしてるつもりはないから余計に混乱するw

994 :デフォルトの名無しさん:2009/12/05(土) 13:00:32
>>991
こういうのはRubyのよくないところだと思うな。
なんとかして欲しい。

995 :デフォルトの名無しさん:2009/12/05(土) 13:07:11
gems.rubyforge.orgじゃなくてgemcutterに変えればいいのか
なんでこんな重要なことなのに知ってる奴いないんだ

996 :デフォルトの名無しさん:2009/12/05(土) 14:06:00
>>995
そりゃ gem tumble 一発で済むからだろ

:~$ cat .gemrc
---
:verbose: true
:sources:
- http://gems.rubyforge.org/
:backtrace: true
:benchmark: false
:update_sources: true
:bulk_threshold: 1000

:~$ gem tumble
Thanks for using Gemcutter!
Your gem sources are now:
- http://gemcutter.org
- http://gems.rubyforge.org/

:~$ cat .gemrc
---
:benchmark: false
:verbose: true
:backtrace: true
:update_sources: true
:sources:
- http://gemcutter.org
- http://gems.rubyforge.org/
:bulk_threshold: 1000

997 :デフォルトの名無しさん:2009/12/05(土) 14:08:30
gemcutterくらい入れとけよw

まあ、たしかにgithubのgemサポート外されたから、
今度からgemcutterがメインになるだろうことはなんらかのなんらかがあってもいいな。周知させとかないと

998 :デフォルトの名無しさん:2009/12/05(土) 14:11:41
>>994
いや現状のこれが「なんとかした」結果だから
ハッシュリテラルの優先度は高くしないほうがいい
そもそものあれとしてメソッドに引数カッコなしで { } 記述のハッシュリテラルを渡すということ自体が稀

999 :デフォルトの名無しさん:2009/12/05(土) 14:16:08
>>989
中カッコを外すとかは?

p "a" => 1, "b" => 2, "c" => 3

1000 :デフォルトの名無しさん:2009/12/05(土) 14:28:51
あ、1000もらいますね。

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

255 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)