Ruby 初心者スレッド Part 65
レス数が900を超えています。1000を超えると表示できなくなるよ。
プログラミング言語 Rubyについての、初心者向けスレです。質問・要望・雑談などをどうぞ
質問するときは、OSやRubyのバージョン、エラーメッセージを書いて下さい。
Ruby on Rails については、WEBプログラミング板で
前スレ
Ruby 初心者スレッド Part 64
https://mevius.5ch.net/test/read.cgi/tech/1535797516/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/
Ruby コミュニティ公式
https://www.ruby-lang.org/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured HTML (HTTP) で Encoding Shift_JIS って書くと怒られた思い出 >>821
いやいやいや
文字集合と符号化方式を別々に選択できる状況ならともかく
「ファイル読み取り時のエンコーディング指定」とかの文脈で使うエンコーディングって用語は
狭義の符号化方式だけでなく文字集合も含めた上位の概念だから >>818
エンコーディングと機種依存文字をごっちゃにしてるやろ。 >>826
SJISは元から(文字集合を)拡張可能なのだから
同じSJISでも機種依存文字は発生する
エンコーディングはSJISもCP932も同じ
文字集合が違うだけ
理解できる? 理解できなくなったら、このようなレスをするんだよなw 例えば、Unicodeは文字集合(キャラクタセット、Coded Character Set)で
UTF-8とかUTF-16というのが符号化方式(エンコード、Character Encoding Scheme)
Unicodeも拡張可能でバージョン番号があって文字集合の内容が変わってる。
Unicode 1.0では文字集合の中の文字数は7,161文字
最新のUnicode 12.1では137,929文字も収録文字数が増えてる。
エンコーディングは変わっていないが文字集合は変わってるので
古いバージョンにしか対応してないコンピュータで、
最新のUnicodeを表示させると一部文字化けする
ただし管理団体の手によって収録文字は決められてるので
ShiftJISの頃のような各社バラバラで互換性がないってことにはならない
(ただし私用領域を使ってる場合は除く) 外字と引っ掛けた洒落や
気い悪くしたんならすまんかった >>830
>エンコーディングは変わっていないが文字集合は変わってるので
>最新のUnicodeを表示させると一部文字化けする
じゃ文字集合だけ更新すれば文字化け解消するのかな?
文脈理解せず無意味なレス繰り返してるとそりゃ外字言われるわ そりゃ、新しい文字集合を使うと、新しい絵文字も正しく表示されるだろ? 正確に言えば、新しい文字集合に対応したフォントを使うとだね。
>>832の言う「文字集合だけ更新すれば」が意味不明だが
「仕様書を更新すれば、なにも変更はいらない」って意味なら
そんなことは誰も言ってない よく出てくる、&:メソッド名は、proc オブジェクトですが、
たまに出てくる、:メソッド名は、何ですか?
違いが、よく分からない
nums = %w(1 2 3 4).map!( &:to_i ) # 数値の配列
p nums.inject( :+ ) # 10 シンボル
実用的には単なる変更不可能な文字列と見做してよい
Rubyの初期からの大きな失敗の一つで、特に意味はない マニュアルの「シンボルの実装と用途」ってところを読むと良いと思う
https://docs.ruby-lang.org/ja/2.6.0/class/Symbol.html
&:to_iも":to_i"がシンボルで、そのシンボルが"&"で修飾されてるだけ
"&"はProcオブジェクトやto_procメソッドを持つオブジェクトをブロックとして渡す時に引数につける修飾記号
実行時にSymbol#to_procが呼ばれてそれがブロックとして渡される mapはシンボルを引数にとらないからmap(&:to_i)でブロックとして渡すけど
injectはシンボルを引数に取るからinject(:+)で実行できる
inject(&:+)としてブロックとして渡してもいいけど無駄処理が入るので普通はやらない 漏れは、いつも、メソッドがシンボルを引数に取るかどうか、分からないから、
ひとまず、map!( :to_i ) みたいに、シンボルを渡して、エラーになったら、
map!( &:to_i ) と、& を付けることにしている >>839
ホントにムダなんか?
シンボルを渡されても、内部でやはりブロックにしてそうだが。 ていうか、なんでそんな半端な設計なの?
injectのみシンボル受け取れるようにするメリットってなに? シンボル・・・型が無い言語で、型を気付かれないように書くための手段の一つ
型がないとされる言語でも、123は数字だが、"123"は文字というように
書き方で型をこっそりと記述している。
他にも/abc/は正規表現型、1.0は浮動小数点型などの定義方法がある。
シンボルはその一つで、:で始めることにより、シンボル型の値を書くことができる >>841
リファレンスにも書いてるけどシンボルとブロックだと扱いが違う
ただパフォーマンスにシビアな箇所じゃなければ特別気にするほどの違いはない
https://ideone.com/p5oW7Y >>843
その「型が無い言語」とか「型がないとされる言語」という理解は間違ってるよ シンボルと文字列を区別したのは失敗だったとmatzも言ってるな
streamという途中でぶん投げた新言語ではその区別がなくなってる >>845
反論は「あってるよ」だけで十分そうだねw >>842
文字列リテラルよりも記述が簡便だからという理由により、本来文字列を使うべき用途にもシンボルが乱用された結果、
シンボルGCなどという頭の悪いものが誕生したりしたんだよな
誰がどう見ても完全に失敗 シンボルは、識別子を表すために作られたのか、数字で始められないだろ。
下はエラーになる
p :"1" # OK
p :1 # エラー >>848
あいやそっちじゃなくてinjectがシンボルを引数にとってブロックみたいな処理ができるって方の話
mapとかは&がいるんだよね? >>849
リテラルが書けないだけで、to_symすれば数字始まりのシンボルも普通に作れる
だから型が文字列と別である理由にはならない >>850
すまん848は>>846に対するレスだ
&:が後付けだから一貫性がないだけで、深い意味はない >>850
sliceやchunkのような分割系以外は
ブロックがなければEnumeratorを返すのを基本ルールにしてるから
mapはシンボルを取る形がないんじゃないかな
injectはEnumeratorを返すものじゃないから
ちょっと気を利かしてシンボルを取る形を加えたのかもね 今年が2.7ってことは
2022年には3か2.10か Rubyで2値の差を得る簡単なメソッドとかないかな
def diff(num1, num2)
max = [n1, n2].max
min = [n1, n2].min
(max - min)
end
p diff(-3, 7) #=> 10
とかだと見てくれ良くないし無駄も多い (num1 - num2).absじゃあかんのか? >>854
最初の小数点の次の数は二桁以上にしない縛りなかったっけ? 今月までプログラミングに一切触れたことのなかった初心者です
引数を配列にして
メソッド内で変数aに引数を代入
その後変数aの0番目にnを代入すると引数の0番目まで巻き添えでnになってしまうんですがそういう仕様なんでしょうか?
配列だけで起こる現象のようなんですが
method(0,1)と呼んで
def method(array)
a = array
a[0] = 10
puts a
puts array
end
とするとaもarrayも[10,1]となってしまいます >>863
ありがとうございます
アドレスの参照先をコピーしてるだけだったんですね
理解しました
調べたところMarshalで書き出せばバイト値もコピーできるようなのでこの方法でいきます >>864
使い方にもよるのかもしれんが階層が浅くて固定ならdupで十分じゃない?
foo = [[1,2], [3,4], [5,6,7]]
bar = foo.dup
bar[0] = [9,9,9]
foo #=> [[1, 2], [3, 4], [5, 6, 7]]
bar #=> [[9, 9, 9], [3, 4], [5, 6, 7]]
bar[1].push 200
foo #=> [[1, 2], [3, 4, 200], [5, 6, 7]]
bar #=> [[9, 9, 9], [3, 4, 200], [5, 6, 7]]
bar[2] = bar[2].dup.push 300
foo #=> [[1, 2], [3, 4, 200], [5, 6, 7]]
bar #=> [[9, 9, 9], [3, 4, 200], [5, 6, 7, 300]]
階層が深くて手動でdupするのが大変ならdeep_dup
require 'active_support'
require 'active_support/core_ext/object/deep_dup'
baz = foo.deep_dup
baz[1].push 300
foo #=> [[1, 2], [3, 4, 200], [5, 6, 7]]
baz #=> [[1, 2], [3, 4, 200, 300], [5, 6, 7]] 年収は、5大SIer, Java などの土方系・奴隷、多重請負構造では、1社間に入る度に、3割抜かれる!
顧客が100万円払っても、間1 が、30万円抜いて、
自社には70万円で来るので、自分の給料は、25万円ぐらいw
顧客が100万円払っても、間1 が、30万円抜いて、間2 が、20万円抜くと、
自社には50万円で来るので、自分の給料は、20万円ぐらいw
だから、ハローワークのIT 講座でも、奴隷になる2次請け以降に、就職しないように言われる。
Javaの平均年収が600万円なら、300万円の奴隷と、900万円の大企業の奴隷使いがいる。
元々、大企業の人は、給料が良いだけ。
給料は言語に関係ない。労働形態による!
抜きを警戒する人は、派遣なら3割抜かれて、後は自分の給料になるけど、
仕事がない期間の保証がない。
それか、フリーランスのエージェントで、1割ぐらいの抜きを探すか
一方、Ruby などの自社サービス系は、多重請負構造じゃないから抜かれない C/C++ 以外のほとんどの言語では、参照がコピーされるだけ!
インスタンスを作っていない
だから、実際のインスタンス数は、clone, dup, new された回数を、チェックすれば良い しかし現実には大半のRubyistよりもSIerのドカタの方が給料は高いのであった 給料だけでもないやろ。
つーか、どうでもいいから。んな話は。 要件定義、外部設計を受注できるプライマリの
会社に行かないと高収入はないよ。
内部設計、プログラミングは下流工程だから下請けに流される。
3割抜くとか言うが、粗利3割はどの業界でも普通だし。 言語を知っている。いや知っているだけで金になる仕事はないから 上流工程が、下級工程の給料を決める
だから、YouTube で有名なKENTA が、
クライアント側ではなく、サーバー側・構築運用へ行った
今世紀最大の起業家、Ruby でVagrant を作った、
HashiCorp のMitchell Hashimoto も、Go でTerraform を作った!
富・技術革新が集中する所に、Hashimoto は行く!
実際に、車のメーカーの企業の時価総額は変わらないけど、
アマゾン・Google などのサーバー屋は、100兆円企業になってる! >>876
日本のIT企業はほぼ国内事業しかやってないし
規模も小さいからどうしても時価総額は上がらないんだろうね
あと大したことやってない >上流工程が、下級工程の給料を決める
>クライアント側ではなく、サーバー側・構築運用へ行った
上流ってそういう意味か?ωωω Amazonの売上の大半はEC
Googleの売上の大半は広告
どっちも実際には上物で稼いでいて、AWSやGCPの売上比率は15%程度に過ぎない
キチガイの目に映る世界と実態の間にはは大きな乖離があることがわかるだろう まあ利益出してるところじゃなくて"売上"というのなら、
ECが一番やろうな。そりゃ Windows10, WSL, Ubuntu 16.4 で、
libruby2.3, ruby2.3 の更新が来た!
Ruby2.3 は、もうサポート切れだけど、まだ誰かがサポートしてるw
Ubuntu チームか Vagrant, Chef, RSpec, Serverspec などの、
DSL の書き方だけができる、ライブラリ・フレームワークはないの? 環境の構築テストなどを、すごく簡潔に、宣言っぽく書いている
例えば、ファイル・ディレクトリなどを作る場合でも、エラー処理もなく、1行で書いてる。
Maven, Gradle も、こういう宣言っぽい感じかな?
便利だなと思って k-sato_at_oiaxって実はもう死んでたりするの? 改訂4版 基礎 Ruby on Rails、黒田努・佐藤和人、2018/9/7
この本が、株式会社オイアクス監修だろ。
著者2人は、株式会社ルビキタスにも所属している 義務教育にrubyが組み込まれなかった時点でrubyは終わりだろ
ポジション取られたのがscratch
ついでにオブジェクト脳の本の社長起立プログラム、あれ最高にキモイ Windows のPowerShell で、1-liner で、webrick サーバーを立てるのに、
上だとエラーになって、
下のように、%Q("./") でクォートすると、正常に動くのは、なぜでしょう?
どういうカラクリなの?
ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 8888).start'
ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => %Q("./"), :Port => 8888).start' windowsで-e の後にシングルクォーテーション使ってるからでしょ
ruby -e 'puts "hello"'
でもエラーになるぞ ちな
ruby -e 'puts \"hello\"'
や
ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => \"./\", :Port => 8888).start'
なら問題ない ruby -e 'puts "hello"'
は、コマンドプロンプトではエラーにならないが、
PowerShell ではエラーになるw
ruby -e 'puts %Q("hello")'
は、コマンドプロンプト・PowerShell の両方で正常
ruby -e 'puts "hello"'
が、コマンドプロンプト・PowerShell から、Rubyに渡る際に、どう変換されるのか?
そのカリクリを知りたい WSL使え
あるいはWindowsのコマンドプロンプトなら
ruby -e "puts 'hello'" 製造者がWindowsが憎いMicrosoftが憎いと言ってるのに、わざわざWindows上で使わなくても。 コマンドプロンプトのクォート解釈は、控えめに言ってメチャクチャだからな。
昔のものだし、しかたない。
それに比べたら、PowerShellははるかにまともで現代的。 まとめ。
Windows10 で、1-liner のruby -e で順に、1〜3 を実行した場合
1. 'puts "hello"'
2. 'puts %Q("hello")'
3. "puts 'hello'"
1〜3は、コマンドプロンプトと、WSL, Ubuntu 16.04 では、
hello, "hello", hello
PowerShell では、
エラー, "hello", hello pythonは””も’’も意味一緒だが
rubyは””と''は微妙に意味違うよな 'puts %Q(hello)'
あるいは
"puts %Q(hello)"
で良いのに >>899
まとめ。
Windows10 で、1-liner のruby -e で順に、1〜2 を実行した場合
1. 'puts %Q(hello)'
2. "puts %Q(hello)"
コマンドプロンプト・PowerShell、WSL, Ubuntu 16.04 のすべてで、
hello
と出力された! >>898
微妙というか、ダブルクォートは中身を命令として実行し、
シングルクォートは中身を文字列として処理する。
全然違うぞ 1-liner を、" " で囲むと「$ \ ` !」などの機能が働くので、
それよりも強いエスケープである、' ' で囲む
' ' で、すべての特殊文字を無効化して、シェルに解釈させないため >>903
それが結局、シェルによるっつー話やろ。 rdoc の説明を読んでるけど、難しい
皆、自作ライブラリをrdoc用に書いてるの? 配列に0から任意の整数を重複なく格納するメソッドを作ってみたんですが、戻り値がnillになってしまいます
どうすれば解決できますか?
def random_sort(array, n)
array = []
judgement_array = [false]
i = 0
while(i < n + 1)
array[i] = rand(n + 1)
k = 0
while(k < i)
judgement_array[k] = array[k] == array[i]
k += 1
end
next if judgement_array.any?
i += 1
end
end
array1 = []
p random_sort(array1, 9) >>908です
定義の最後の部分で戻り値を記述するのを忘れており
記述したら解決しました digitsメソッドが返す配列を元の数値に戻すには
自分で計算するしかないのかな
何かついになるメソッドがないかと
探してみたけどわからなかった ないね
p [1, 1, 0, 1, 'hoge'].to_i(2) # => 11
みたいなString#のあってもいいよね 誤爆
みたいなString#to_iに相当するメソッドがあってもいいよね これの逆を考えるか
123.to_s.chars.map(&:to_i).reverse
123.digits
#=> [3, 2, 1]
他には、Array#pack、String#unpack とか 自分で計算というか.reverse.join.to_iすればいいよね? 見た目シンプルだけど一旦文字列を経るのがモヤっとする
かといってreverse_each.inject(0){|v,d|v*10+d}とかやると何やってるのか分かりづらいしなあ >>914
Math::BaseCalc - Convert numbers between various bases - metacpan.org
https://metacpan.org/pod/Math::BaseCalc
昔探したがperlにはあるがrubyにはないtpyhonにも無い
なんで無いのか分からないほど便利な関数なのになんで無いんだ? tpyhonは知らんけどpythonにはnumpyでpackbitsがあるんやで >>919
>>914が言ってるのは単なる基数の変換じゃないよ
基数の変換はto_s, to_iに2~36までなら直接渡せるからそれで済ませることが多い
もっと大きい基数が必要になってもinjectやmapで簡単に変換可能だから
いくつかgemあるけど人気ない こういう基本的なものは、言語そのものに内蔵しないといけない
gem作っても流行らない レス数が900を超えています。1000を超えると表示できなくなるよ。