Ruby 初心者スレッド Part 61 [無断転載禁止]©2ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
Ruby on RailsについてはWEBプログラミング板で
前スレ
Ruby 初心者スレッド Part 60
https://mevius.2ch.net/test/read.cgi/tech/1493398918/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/ 「privateはsendとかでアクセスできるし、サブクラスからも見える」だそうです。確かにそうだ。publicは壊れていないと思いますけど、他2つが(access control として)壊れていたら、そもそも指定できる必要はないとは言えそう。 sliceで負数を指定したときの挙動の解釈が合ってるか教えてくれ
例えばnに12345って文字列があったとして
p n.slice(0,1)
p n.slice(-1,0)
ってやると1と5が出力される
つまり、絶対値が正数の負数が文字列の後ろから順々に対応してるって解釈で合ってる? >>859
あってる
StringだけじゃなくてArrayでも同じ
ちなみに二つの整数値を与えるのではなく範囲で終わりを示す方法もよく使われる
p "12345".slice(1..-1) # => "2345" # 二つのピリオド
p "12345".slice(1...-1) # => "234" # 三つのピリオド
p "12345".slice(1..-2) # => "234"
p "12345".slice(1, -1) # => nil # 二つの引数
sliceだけじゃなくて[]でも同様に使う事ができる (-6..6).each{|i|p n[i]}と試せばすぐにわかることをなぜ人に聞くのか というかp n.slice(-1,0)は""じゃないのか >>860
サンクス
ついでに聞くけど
二つピリオドの方は範囲xが『1番目≦x≦-1番目』で
三つピリオドの方は範囲xが『1番目≦x<-1番目』って事でいいの? >>863
その認識でいい
それと>>862の指摘は正しい
俺様うっかりしてた イミュータブルの話していい?
記憶違いかもしれないけど、なんか将来のRubyでStringがイミュータブルになるって話だかを小耳にしたんだけど、どういうこと?
今のStringって書き換える操作に見えても実は別の生成したStringへ参照を換えているだけだで、
イミュータブルだと思ってたんだけど違うの? >>866
<<したらインスタンスの中身が書き換わるよ
まあRailsがフォークしてMRIは事実上終了だろうから心配いらない 現実的に考えて、今のRuby界にPython3ショック並の非互換を乗り越える体力はない
そもそも3がリリースされる日が本当に来るのかは怪しいけど、もし出てもRails系には完全スルーじゃないかな
静的型もメタプログラミング全開のRailsに役立つようなものにはならないだろうし >>866
今はリテラル文字列のオブジェクトが別だけど
ruby3になったらおなじオブジェクトになるって事
今のrubyでもコマンドラインオプションやソースコードのマジックコメントで挙動を確認できる
$ ruby24 -e '5.times{ p "abcdefg".object_id }' 17208605440
17208605280
17208605200
17208605120
17208605020
$ ruby24 --enable frozen-string-literal -e '5.times{ p "abcdefg".object_id }'
17208605640
17208605640
17208605640
17208605640
17208605640
rubyの実装レベルの話だと内部で共有文字列オブジェクトがcopy on writeされるようになってるだけ
ruby3になると共有文字列オブジェクトが直接表に出てくるってことになるんだろうね 一番の違いは文字がイミュータブルになるってことだろ
だからcopy on writeする必要もない
writeできないんだからcopyも不要 >>869
また静的型かよ
それにRailsのコミッタがどんだけRubyコミッタとしても掛け持ちしているのを知らんのか ruby3にショックを起こしそうな変更が大してなさそうな所がショックなのではないだろうか
文字列といえば、SHARABLE_MIDDLE_SUBSTRINGはruby3で標準になるのか誰か知らんか >>874
今はArrayだけだもんね
ぜひとも標準にしてもらいたいけど
俺を含めて第三者のC extensionに不安があるからなあ 文字列のデータがヌル終端文字列とは限らないので、char*取る時はStringValueCStr()使うとか たのしいruby読みとおしたけどあんまたのしくない プログラミングが楽しいんであって
本で勉強するのが楽しいわけじゃないからな 関数型言語 Elixir からの影響
文字列が、immutable なら、安全で効率的 >>866
Rubyで文字列をfreezeしまくるのが流行ってて
なんでかって、最適化のため
> http://d.hatena.ne.jp/ku-ma-me/20151004/p1
> 2 行目は 1 行目の 2 倍くらい速いです。
だもんで、freeze付けまくるっていう手動の最適化が蔓延していて
(二倍も速くなるならせざるを得ない)
なにかCとかアセンブラでシコシコ最適化していた90年代の香りがする
これもRubyが意味もなく遅すぎるのが原因で
主要言語と比べて30〜50倍ぐらい遅いので、3.0GHzの最新CPUで走らせても
実質60〜100MHzの激遅化石CPUで走らせていることになるので
まぁ90年代といわれれば、ちょうどそのあたりかもしれない
> https://qiita.com/sue738/items/6c312672cecd9e0400a2
あの頃はちょっとの速度差がクリティカルで、何か懐かしいね
Rubyはコンピュータに出来ることはコンピュータにやらせる主義なので
プログラマに手動の最適化を強いるし、型チェックもプログラマにやらせる
何か矛盾したことを言っているように思えるが
言語開発者の視点に立って、全力で手抜きして言語処理系を作ることを考えると
別に間違ったことは言ってない
幽遊白書風に言うと、仙水の言う「俺達七人」に君らは入ってないってことだな 早くしたいなら言語変えろよ
JavaでもC#でもGoでもさ 腕振り回すのが早いからって、野球選手にはなれないんだけどね。 速度が必要なら他の言語を使え、と言いつつも
巷ではfreeze祭り開催中
(事実それが理由で3.0で検討されてるわけで)
やはりちょっとでも早くしたいというね
遅いといっても限度があるんだろうな
1.2倍とか1.5倍とかなら我慢できるが
30〜50倍は別次元というか、もはや別物
折角3.0GHzの最新CPUを使ってるのに
100MHz以下になるとはねトホホ
プログラムは遅くて困ることは有っても速くて困ることはないわけだが
遅くなった原因が、今となっては何のメリットもない動的型を採用したことと
コンパイラの最適化の手抜き、だからな
ちっとも利用者視点じゃなく、単に言語を作る側の手間の都合なわけだが
教祖様よろしく巧みに隠して言いくるめてきたが、もうウソがばれて限界ってところかな >腕振り回すのが早いからって、野球選手にはなれないんだけどね。
さすがに意味不明すぎて吹いた
他の主要言語は、腕振り回しているだけだとも?
随分だな 今やC/C++、Java、C#などの主要言語はコンパイラの最適化が鬼だから
常識的には人間がアセンブラで書くより速いわけ
だから書くなら
じゃぁC/C++、Java、C#使っておけば?
だし、言われるまでもなく世の中そうなってて
んーだから何?って感じなんだが
なんというか・・・
速度が速い代わりに使い勝手が悪い、だの
使い勝手が良い代わりに速度が遅い、だの
そういう厨が好みそうなマンガの設定みたいなトレードオフは発生してない
非常だわなぁ
では全てにおいてメリットが無い方式なら
いったい誰が作って、誰が支持するのかというと
これがなかなか北朝鮮のような国があったりもするので
存在していることだけを理由に正しいとは言えない >>889
アホか?
C++がマジで使いやすくて速いとか思ってるなら、一回脳みそ洗濯機にかけた方がいいぞ?
C++は速さのために色々と犠牲にした言語だということを理解できないならエンジニアとして
致命的欠陥があると言わざるをえない Javaや.NETは起動時にコンパイルしてるから
実行速度ではなく起動速度が遅い
そしてRailsも起動が遅い。こっちは理由が少し
異なっていて動的型だからコンパイルが不要なんだが
読み込むファイルが多くなりすぎて起動速度が遅い いくら早くたってC++は複雑で読み書きしにくい
Rubyは実行速度より開発速度に振ってるから >>892
というほどでもないんだよなあ。
とくにC#あたりと比べると。 >>890
C++11以降はRubyよりはるかに使いやすい。 スタートアップにはRailsが好まれるというのも眉唾だよな
ソースの量なんて最初のうちはすぐに増えるもんだし、事業が軌道に乗るまでは大きな変更も多いはず
とりあえず今手っ取り早く動くものを作りたいからという理由でRailsを選ぶような奴がテストなんか書いてるわけないし、
テストがないと変更が困難になるという動的型の性質がネックになるのは意外とすぐなんじゃないかという気がする C#は「とても」書きやすいかといわれるとふんぬうううううって感じだ
書きやすいようにするモダンな構造はたくさん含まれてて文法未来も明るいが、全体としてはRubyのほうがまだいいと思う
今のところRubyよりいいなと思ってるのはKotlin+IntelliJ
Javaで書かなければいけない部分がもっと減れば書きやす四天王に入ると思うのでどんどんKotlin部分増やして欲しい >書きやす四天王
面白そうだからみんなで書いてみれば?
オレの場合書きやすいのはRuby一強で
二位以下はPythonとかLLが団子状態で並ぶけど いや、洗脳されてる(というより確信犯←本来の意味でも誤用の意味でも)人の意見は
誰も興味ないというか常に無視されるというか
社民党が何か言っててもみんな聞き流してるわけで
大人な人達の言うところの民主主義というか
そもそも数に入ってないから無視してよいという暗黙の鬼畜現象 >>899
自分の意見のことですね
よくわかります 同じ事させるなら、「実行速度」がRubyより早い言語が有るのは当たり前。
Rubyは例えばCで書いた巨大ライブラリ・ツールとも言える訳だから。 話を変えるけど、
mswin32版のRuby2.4インスコして、今は懐かしきRDEで何か出来ないかハックしてんだけど普通に動くなコレ
動かない部分は、debug2から経由してrde.dllかrde.soを呼ぶデバッグ機能の辺りで、
バイナリについてきたこれらのファイルをロードできないのが原因だけど、
RDE1.1.1バイナリや1.0.1ソース拾えたんで何とかなりそう RDEはすごく使いやすかったな
1.9や2.x以降も対応してくれるなら今でも使いたい
文字列コード関係とか問題ないの? >>904
特に問題ない
というかRubyの多言語化はCSI方式と呼ばれるもので、
ruby内部では種々の文字コードを認識せずバイナリとして扱い、指定した文字コード用のメソッドでバイナリに処理してるだけだから
マジックコメントでUTF-8指定して(2.x以降はデフォルトがUTF-8だから指定しなくても良い)、RDEもUTF8N指定しとけばOK
後、RDEについてるrde_export.rbみてたらちょっとした書き換えで2.4用の入力補完データを自動で出せるようになってる
RDEハック中だから、他にも聞きたいことあったら言ってくれ 問題は2.4用のrde.dllが無いことだからmswin32ruby1.8用のrde.dllをバイナリ改造して
msvcrt-ruby18.dllのロードをmsvcr100-ruby240.dllに書き換えて、
メソッドあわせれば楽に出来るんじゃないかと思いついたんだけど躓いた
msvcr100-ruby240.dllをPEviewで確認したらrb_str_new2が無いじゃないか
こういった内部に詳しい人、誰かいない? 日経Linux 11月号
Windows Subsystem for Linux (WSL) 特集。
ついに、ベータ版から正式版へ変わりました!
Docker の記事もある
Ubuntu 側では、Dockerデーモンが動かないため、
Windows 側の、VirtualBox に、Vagrant で、CoreOS を入れて、
その中に、Dockerデーモンをインストール
Ubuntu側から、Dockerコマンドで使う
付録は、サーバーがゼロから分かる本、100ページ。
サーバーでできること、77
付録DVD は、
Ubuntu 17.04 日本語 Remix (64 ビット版)
Ubuntu Server 17.04 (64 & 32 ビット版)
CentOS 7.3 LiveGNOME (64 ビット版) >>906
外部シンボルの有無だけじゃなくstruct RStringとかRArray、RStructなんかは
要素数が少ない時にRObject内へと埋め込むようになってるし、
文字列オブジェクトとかは文字のエンコーディング情報を
抱えるようになってるしでまず無理
ソースコードを対応するrubyに合わせたパッチで当てて再ビルドした方がまだ近道だろうな マジで?
ruby2.4(maswin32)いれたRDEのデバッグオプションを"-r debug2"から"-r debug"に書き換えると変数ウィンドウもデバッグも普通に問題なくうごくけど、
変数ウィンドウのオブジェクト表示タブで、一部オブジェクトの型が表示されず"(1)"表記されるのはそれが理由か
それと、rde.dlやrde.soをいれなくても、出来るってことは変数ウィンドウ辺りはRDE本体の機能かな?
これら機能が"debug"や"debug2"にどこまで依存してるのかいまいち分らない
ぱっとみrde.dlやrde.soだけruby2.4(mswin32)に対応したのをコンパイルすれば解決かと思ってたけど、
とりあえず、
SourceForgeやOSDNから拾ってこれるrde 0.9.9.0のソース(1.0.1はソースじゃなくバイナリだった、ごめん。一番新しいソースは0.9.9.0になる)をもう少し見てみるよ
現時点でもデバッグオプションを"-r debug2"から"-r debug"に書き換えればまともに動くんだからそれほど不都合は無いんだけど RDE自体書き換えて再ビルドすりゃいいじゃん
ソース何で作ってあんのよ
……Delphiか…
すばらしい言語とすばらしい仕様とすばらしくない会社に翻弄された不遇の子か…
ほかのIDEのアドオンとかに注力したほうがいい…? RDEもどきはGUI周りはGTKとかQtを使うにしても
基本的にRubyだけで再実装できないものなのかな? 観念してVSCodeを使おう
TypeScript製なのでRubyistにとっては敵のケツを舐めることになる屈辱的なエディタだけど、他のを使う理由が見つからないレベルの出来 RDEってさして知らないんだけどemacsじゃあかんの? irbでコードを直接打ち込むとちゃんと動作するんだけどそれと全く同じコードをメソッドとして定義してそれを実行するとできないのなんでよ >>918
def binsort(a)
bin = []
(a.max+1).times do |i|
bin.push(a.count(i))
end
a = []
bin.length.times do |k|
bin[k].times do
a.push(k)
end
end
end
aは整数値の配列
この中身をirbで直接実行するとちゃんとソートしてくれるんだけどbinsort(a)で実行すると何もしてくれないのよ irbでもソートされないんだけど?
ちゃんと戻り値使いましょうね
def binsort(a)
bin = []
(a.max+1).times do |i|
bin.push(a.count(i))
end
ary = []
bin.length.times do |k|
bin[k].times do
ary.push(k)
end
end
ary # ←これ
end うちのirbだとさっきのでちゃんとソートされたんだが 殆どのバージョンで試したけどそのようにはなりませんでした
君の実行環境を書いてください a=Array.new(100) do rand(5) end
とかでaを決めてさっきのコードをirbで実行
それでもう一度aを表示するとソートされた配列が表示されるけど、binsort(a)でやってaを表示するとaそのものは変わってないって状況
だったんだけど
a=[]
のとこを
a.slice!(0..-1)
にしてやったらa自体を変えられた 日本語として何が言いたいのかさっぱりわからん
同じアルゴリズムなら俺ならこう書く
def binsort(a)
(0..a.max).inject([]){|s, i| s + [i]*a.count(i)}
end これは多分あれだな
実引数aを表示してると思ってるけど実は仮引数aを表示しているパターン Ruby書くのにVSCode使ってるわ
Ruby陣営にとっては多少アウェイなのかもしれんが
使いやすければどうでもいい >>916
Emacsでいいよね
MatzもEmacsだし、ある意味公式w 現在のプログラマーにとって
統合開発環境使わないのであれば
VSCodeは王道だろう。
秀丸とか使っているならアウェイだろうけど VSCodeは使用する言語のためにゴリゴリに整えられたemacs的な環境がクソ簡単に作れるのが強いよね
エディタの設定にアホみたいに手間かけてドヤ顔してた奴等がただの老害になってしまった
さすがに30年近く開発環境作ってるだけのことはあるわ 現在のつづりの途中からファイル内全検索で補完候補を表示したり、クラスやモジュールのメソッドや定数まで定義したもの全て(もちろん、自分で定義したものも含む)から関連した補完候補を表示してくれたり、
ファイルジャンプやエラー時の該当コードへのジャンプジャンプ機能、
変数ウィンドウでリアルタイムにグローバル、ローカル等表示機能、
デバッグ時のブレークポイント・ステップイン・ステップアウトといった基本から、シームレスにコンソール入力できCLIでデバッグしたりと、
RDEを使えるならずっと使い続けたい
逆にRDEで欠けているところって何かある? >>931
Emacsは自由度は高いんだろうけど
設定にムチャクチャ時間かかるからな
VSCodeはデフォルトで使えるから楽 >>932
どれだけ高度な機能があろうが所詮Rubyでしか使えないだろ
Rubyがメインの開発でも開発作業というのはRubyだけで完結するものではない
VSCodeはシェルスクリプトもHTMLもCSSもJSもXMLもJSONもYAMLも他の言語も何でもそこそこ便利に扱える >>934
RDEもRuby以外の言語、例えばJSやHTMLとかなんでも出来るよ
指先一つで切り替えられるし >>935
他の言語のデバッグできるの?
他の言語でコード補完効くの? >>636
HTMLでデバッグってどういう事?
強調表示と文章構造化機能があり、
Rubyから扱うならRDEの変数ウィンドウだってあるんだから、見ながらできるでしょ
RDEにはコンソールウィンドウだってあるんだから、どんなやり方だって可能だよ >>933
今は設定もLispはほとんど書かなくてもいいし、パッケージマネージャもあるし、設定は簡単だよ
英語というハードルはあるけど >>938
絶対的にEmacsは昔より易しくなってるんだろうけど
相対的にVSCodeの方が易しいからそっち使ってる VSCode使ってるようなチームが今時開発のコミュニケーションにメールはないでしょ
githubのプルリクを扱ったりSlackの送受信したりするプラグインはもちろんあるよ >>939
機能の豊富さやモダンな設計部分は確かに惹かれる点がないわけではない
ただ、VSCodeには絶対移れない理由は、カーソル移動すらホームポジションから指を
離さないといけない部分だ(Mac版はいいんだが)
もちろん「そんなのカスタマイズでどうにでもなるよ」という意見は承知しているが、すべての機能を
再配置するには無理があるし、拡張機能まで考えるとキーバインドはなるべくデフォルトでいきたい
そうなるとカーソル移動にカーソルキー以外のキーが割当たってないのは大いなる不満だな
ちなみにこれは実際にVSCodeを使ってみた感想だ
Emacs風キーバインドとかも試してはみたが、不完全だし、拡張機能を入れると簡単に破綻した 慣れているものがあるのにわざわざ移る必要はないよ、
便利な機能は追加されているけど
それの習熟までの時間考えるとマイナスじゃん >>943
Emacsキーバインドは根本的に間違ったキーバインドなんだよ
vimキーバインドも同様。
つまり間違ったキーバインドを使うから破綻する >>942
開発が長期間止まってるけど
使えなくはないんじゃないの? >>945
それならばVSCodeが正しいキーバインドを提供すればいいだけなのに、それはされなかった
Mac版VSCodeに至ってはカーソル移動はEmacsと同じだ
(というかMacのカーソル移動は基本Emacsと同じなんだが) MacがEmacsと同じ?どうやってコピペするんだよw Macは通常のショートカットキーはCtrlではなくコマンドキーという別のキーを使うんだよ レス数が950を超えています。1000を超えると書き込みができなくなります。