X



Ruby 初心者スレッド Part 67

0001デフォルトの名無しさん (ワッチョイ b72c-yePO)
垢版 |
2020/12/25(金) 04:24:27.68ID:aa9Khe9z0
プログラミング言語 Rubyについての、初心者向けスレです。質問・要望・雑談などをどうぞ

質問するときは、OSやRubyのバージョン、エラーメッセージを書いて下さい。
Ruby on Rails については、WEBプログラミング板で

前スレ
Ruby 初心者スレッド Part 66
https://mevius.5ch.net/test/read.cgi/tech/1578068134/

るりまサーチ (リファレンス検索)
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
0022デフォルトの名無しさん (ワッチョイ 8205-I5PR)
垢版 |
2021/01/06(水) 02:45:29.91ID:X+T/DkCZ0
プログラミング自体初心者です
ファイバーを全く理解していなかったので勉強してみているのですが

class Test
def initialize
@fiber = Fiber.new {test}
end
def test
p "これがファイバーのブロックで与えた処理だ"
Fiber.yield
p "理解したかな???"
end
def fiber_test(count = 60)
@fiber.resume
p "帰ってきたぞ"
@fiber.resume
p "再び帰ってきたぞ"
count.times do {Fiber.yield}
end
end

このコードを組んで別の場所でTest.new.fiber_testとインスタンスを作成して呼び出してみたのですが
@fiber.resumeでtestメソッドへ移動し
Fiber_yieldでfiber_testメソッドへ戻ることはわかったのですが
testメソッドで@fiber.resumeを実行すると親子関係がおかしくなるからかFiberErrorを起こすのに対し
fiber_testメソッド側でFiber_yieldを実行すると一瞬画面が止まるだけでコンソールにも何も表示されません
これは何が起きているのでしょうか?
引数のcountを増やすほど長く画面が固まります
0025デフォルトの名無しさん (ワッチョイ 2e2c-qBFf)
垢版 |
2021/01/06(水) 06:33:24.80ID:2hpPqzu40
f = Fiber.new do
n = 0

loop do
puts "子の前 : #{ n }"
Fiber.yield( n ) # 親へ
puts "子の後 : #{ n }"

n += 1
end
end

2.times do |idx|
puts "親の前 : #{ idx }"
puts "親の値 : #{ f.resume }" # 子へ
puts "親の後 : #{ idx }"
end

出力
親の前 : 0
子の前 : 0
親の値 : 0
親の後 : 0

親の前 : 1
子の後 : 0 # 要注意!
子の前 : 1
親の値 : 1
親の後 : 1
0027(u_・y) (アウアウウー Saa5-Jh9r)
垢版 |
2021/01/06(水) 12:45:06.84ID:I0SDZM+6a
Fiber.yield と @var.resume で処理の投げあいをしてるだけ
で、resumeは変数のメソッドだから変数が参照できればどこからでも呼べるが、
Fiber.yieldっていうのは、Fiber.new{ ここ }の中でしか呼び出せない

なお初心者がFiberを使ったコードを書いても普通にloopで書いたほうがいいもんを煩雑にさせるだけだから今覚えてもすぐ明日から使うぞーってなる機能ではない
0028デフォルトの名無しさん (ワッチョイ 42bb-zSX4)
垢版 |
2021/01/06(水) 14:48:29.93ID:eEkuR0nA0
Ruby使った事ない勢です
知人から恐らくruby(のgem ocra)でコンパイルされたexeファイルを修正してほしいと頼まれたのですが
これ逆アセンブルする方法無いですか?
0030デフォルトの名無しさん (スフッ Sd62-BgNG)
垢版 |
2021/01/06(水) 18:53:39.35ID:tXuutWqgd
>>29
無知で申し訳ないです
サクラエディタでexeとか怪しいtmp開いてみたけど見られないんですよね
解凍というのはどう言うことでしょうか?ocraにそういったコマンドがあるのでしょうか?
それとも実はzipでコンパイルされてるとか?
0033デフォルトの名無しさん (ワッチョイ 42bb-zSX4)
垢版 |
2021/01/06(水) 23:02:25.85ID:eEkuR0nA0
>>31
出来ました、ありがとうございます
0035デフォルトの名無しさん (ワッチョイ 2e2c-qBFf)
垢版 |
2021/01/07(木) 00:57:12.57ID:ikfTGx5+0
0 で始まる数値は8進数だから、:numeric ではバグル

012 は、10 になる。
一方、09 は8進数では存在しないから、9 となる

require "csv"

text = <<'TEXT'
"09",1
"012",2
TEXT

csv = CSV.new( text )
csv.convert( :numeric )

p csv.read
#=> [ [9.0, 1], [10, 2] ]
0037デフォルトの名無しさん (ワッチョイ 468c-1BNf)
垢版 |
2021/01/07(木) 03:01:27.13ID:BvHUxMcb0
>>35 そうそう、これもどうにかしたかった
>>36 nullがあるとダメじゃね?

>>19の例が単純すぎたのでもうちょっとマシな例
"0123456789","5CH CO.,LTD","2021/01/01",12345.67
"0123456790","2CH.COM",,0.00
0041(u_・y) (アウアウウー Saa5-Jh9r)
垢版 |
2021/01/07(木) 20:00:34.95ID:pRSWPdMla
友達いなそう
0042デフォルトの名無しさん (ワッチョイ 5fda-Cbw0)
垢版 |
2021/01/11(月) 00:35:09.75ID:RMa4jLhx0
ruby初心者です。

調べたけどわからないので教えて下さい

neriでexeファイルを作ろうとすると、簡単なもので試したのですが、
internal:C:/Ruby30-x64/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in
`require': cannot load such file -- Win32API (LoadError)
のエラーが出ます。
Windows 10
ruby 3.0 x64
Bat_To_Exe_Converter v3.2
0044デフォルトの名無しさん (ササクッテロラ Spb3-eSWr)
垢版 |
2021/01/11(月) 09:03:37.19ID:LZqNfRTHp
>>43
gem listでwin32-api(1.9.2 universal-mingw32)
はありました。
0046デフォルトの名無しさん (アウアウウー Saa3-zMe3)
垢版 |
2021/01/11(月) 15:49:37.24ID:NK5j5E+la
Win32APIはruby3.0から廃止
当然Win32APIを使ってたgemsはRuby3.0では作者がメンテナンスするまで動かないからneri作者の尻ひっぱたくか前のバージョン使え
0048デフォルトの名無しさん (ワッチョイ df01-zMe3)
垢版 |
2021/01/11(月) 16:04:22.15ID:KSKcxhht0
Windowsに嫌われてるとか言ってたな。
0050デフォルトの名無しさん (ササクッテロ Spb3-eSWr)
垢版 |
2021/01/11(月) 22:59:29.10ID:jE21Oyzwp
>>46
なるほど。ありがとうございます。
わからず、ずっと悩んでました。
0054デフォルトの名無しさん (ワッチョイ 5f06-jsk3)
垢版 |
2021/01/23(土) 12:19:40.78ID:joIGd+XG0
教えていただきたいのですが、rubyのclassでそのclassに存在するプロパティ一覧を取得する方法ありますか?

以下の様なクラスを作ってます。

class Data
def self.csv_header
return 'name,id,data1,data2'
end

attr_reader :name, :id, :data1, :data2

def initialize(name:, id:, data1:, data2)
@name = name
@id = id
@data1 = data1
@data2 = data2
end

def to_csv
return "#{@name},#{@id},#{@data1},#{@data2}"
end
end

要するに、何か複数のデータを持つクラスがあり、それをcsvとして出力したいです。
そのヘッダーを出力する機能をクラスメソッドとして持たせたいのですが、このクラスメソッド(csv_header)の中身を手で書くのではなく、javaで言う所のreflectionか何かを使って出力する方法はありますか?


よろしくお願いいたします
0057デフォルトの名無しさん (ワッチョイ 5f01-oRbG)
垢版 |
2021/01/25(月) 18:43:13.07ID:co/Rkwpa0
>>54
そういう用途はStruct使うといいんでない?

Foo = Struct.new("Foo", :name, :id, :data1, :data2)
foo = Foo.new("foo", 1, "123", "456")
foo.to_h.keys
#=> [:name, :id, :data1, :data2]
foo.to_h.keys.to_csv
#=> "name,id,data1,data2¥n"
0058デフォルトの名無しさん (ワッチョイ 5f01-oRbG)
垢版 |
2021/01/25(月) 18:47:31.66ID:co/Rkwpa0
Structは初期化時の引数の数が一致してなくてもエラーにならずにnilがデフォルト値になる
それがいやな場合は継承してコンストラクタを上書き

class Bar < Struct.new("Bar", :name, :id, :data1, :data2)
def initialize(name, id, data1=nil, data2=nil)
super
end
end
0059デフォルトの名無しさん (バットンキン MM7a-HhZe)
垢版 |
2021/01/29(金) 04:39:32.60ID:sK+sAxFfM
質問させてください。
以下のようなデータがあるとして。

data = {
"id": "price_xxxxxxx",
"object": "price",
"active": true,
"billing_scheme": "per_unit",
"created": 1234567,
"currency": "usd",
"metadata": {
"commission": "2"
}
}

このデータを p data.metadata.commission とすると4が表示されるようにしたいです。
どうやって変換すればいいでしょうか?
0060デフォルトの名無しさん (バットンキン MM7a-HhZe)
垢版 |
2021/01/29(金) 04:40:41.40ID:sK+sAxFfM
>>59
すいません、4じゃなくて2でした。。
0061デフォルトの名無しさん (ワッチョイ 2a01-I+PI)
垢版 |
2021/01/29(金) 13:59:12.19ID:IOP7xwlv0
普通にブラケットでアクセスするかdigしたほうがいい気がするが
どうしてもドットでアクセスしたいなら再帰的にOpenStructに変換する

data = JSON.parse(data.to_json, object_class: OpenStruct)
data.metadata.commission
#=> "2"
0062デフォルトの名無しさん (ワッチョイ 662c-CS/l)
垢版 |
2021/01/29(金) 14:31:44.23ID:MVM9RsSY0
ハッシュだから、hash.x.xyz は無理だろ

Effective Ruby の項目10 に書いてある、
構造物はハッシュじゃなくて、クラス・Struct を使おうというやつだろ

ただ、その都度、構造が変わるものは、ハッシュの方が良いし、
構造がネストしている場合も難しい

require "json"

json = <<'JSON'
{ "a": "abc",
"x": {
"xyz": "2" }}
JSON

p hash = JSON.parse( json ) #=> {"a"=>"abc", "x"=>{"xyz"=>"2"}}

p hash[ "x" ][ "xyz" ] #=> 2
0063デフォルトの名無しさん (バットンキン MM7a-HhZe)
垢版 |
2021/01/29(金) 14:57:50.28ID:sK+sAxFfM
>>61, >>62

ありがとうございます。
背景を書いてませんでしたが、rspec で必要なデータなのです。。
後出しですいません。
なので data.metadata.commission で確認できることが必要なので、Struct(もしくはOpenStruct)で、変換させてみます。
0065デフォルトの名無しさん (ワッチョイ 6a06-fCoL)
垢版 |
2021/02/03(水) 22:28:17.16ID:S1/u+juE0
>>54です。
アドバイスありがとうございます。

私も色々と調べたのですが、オブジェクトを1回作らないと難しいかもしれませんね。
仮にデータが全くなかった場合、csvのヘッダーのみ記述されたcsvファイルを出力したいと考えています。
しかし、データが全くないと、オブジェクトが無いため、オブジェクトからプロパティを取得する方法が使えません。
もちろん、ダミーのオブジェクトを作ればOKですが、少々不自然かと思いました。

Structは知らなかったので、勉強させていただきます。

ありがとうございました。
0070デフォルトの名無しさん (ワッチョイ cbb3-8Wj8)
垢版 |
2021/02/15(月) 00:33:16.20ID:KKKRaaGF0
すまん唐突だけど質問させて eql口頭でってなんで読んだら良いの?
0071デフォルトの名無しさん (ワッチョイ cbb3-8Wj8)
垢版 |
2021/02/15(月) 00:34:14.29ID:KKKRaaGF0
ミスった
eqlって口頭では何て発音したら良いの? です
0072デフォルトの名無しさん (オッペケ Src7-JgCO)
垢版 |
2021/02/15(月) 11:38:51.60ID:adP2s3N/r
イコールって読んでる
equal?とeql?が入り乱れて使われてるところはしらんが。
まぁrubyしてるならequalとeql両方知ってるはずだし短いイコールの方、とかでも伝わるんじゃ
0075デフォルトの名無しさん (ワッチョイ cbb3-8Wj8)
垢版 |
2021/02/16(火) 21:32:31.57ID:fxt1OOtg0
>>72
rubyやり始めたところで、eqlがイコールって気づかなかった。短い方のイコールって良いですね!ありがとうございます。
>>73
自分もイーキューエルだて頭の中で読んでた
>>74
なんでやーーー!!
0076デフォルトの名無しさん (ワッチョイ cbb3-pcjv)
垢版 |
2021/02/16(火) 22:13:45.11ID:fxt1OOtg0
すみません、質問です
hash生成時に、
str={"key1" = "val1"}
ではエラーになる理由を教えてください。
0078デフォルトの名無しさん (ワッチョイ cbb3-pcjv)
垢版 |
2021/02/16(火) 22:28:16.05ID:fxt1OOtg0
>>77
すみません、携帯からで全角と半角を間違えてしまいました。半角として見てくださいm(_ _)m
007977 (ワッチョイ 162c-FDiY)
垢版 |
2021/02/16(火) 23:01:49.84ID:F9q4wvox0
p h_1 = { "a" => "b" } #=> {"a"=>"b"}

p h_2 = { "あ": "い" } #=> {:あ=>"い"}
p h_3 = { one: 1, "two": "2" } #=> {:one=>1, :two=>"2"}

新しめの書き方では、2, 3 みたいに書ける

: を使うと、文字列のキーがシンボルになる
"two": が、:two になる

one: はシンボルのまま
0080デフォルトの名無しさん (ワッチョイ cbb3-pcjv)
垢版 |
2021/02/16(火) 23:13:47.99ID:fxt1OOtg0
書いていただいた方法でないと生成できないのですね
丁寧な回答ありがとうございました
0082デフォルトの名無しさん (ワッチョイ bf2d-A6sh)
垢版 |
2021/02/20(土) 02:27:26.66ID:SWSWE4Ss0
AtCoderの解答見てると、rubyで巨大配列を扱うような時に激遅になりがちな気がする
配列アクセスの遅さなのかループの遅さなのかわからんが
0084デフォルトの名無しさん (ワントンキン MMa7-bvMg)
垢版 |
2021/02/23(火) 21:47:53.55ID:QIohwxjcM
irbにおいて、
def test; p test; end
とだけ打ち込みました。
すると、Enumerable.methods.grep(/test/) => [:test]
が得られます。
何故、testメソッドが勝手にEnumerableのメソッドになるのか教えていただけないでしょうか。
環境は
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin18]
です。
008887 (ワッチョイ cf2c-QclQ)
垢版 |
2021/02/24(水) 02:26:45.21ID:YN61hHjA0
p test が文法エラーになるのでは?

test という識別子が存在しないから
0089デフォルトの名無しさん (ササクッテロラ Sp07-GD1z)
垢版 |
2021/02/24(水) 07:33:53.13ID:UUqFv7Fhp
0084です。

def test; p test; end
ではなく、
def test; p “test”; end
でした。
大変申し訳ありませんでした。
ほかのメソッドでも同じような動きを確認しています。今日は立て込んでしまっているので、追って別のメソッドの例も提示します。
0090デフォルトの名無しさん (ササクッテロラ Sp07-GD1z)
垢版 |
2021/02/24(水) 07:38:08.91ID:UUqFv7Fhp
>>0085さん、確認ありがとうございます。

私は初心者なので、以下の認識で正しいか、何か例外があるのか不安でお尋ねしました。認識は正しかったようですので、もう少し調べてみます。

>トップレベルで定義したメソッドは Object の private インスタンスメソッドとして定義されます。
0095デフォルトの名無しさん (ワントンキン MM9f-bvMg)
垢版 |
2021/02/24(水) 20:33:38.12ID:p2P+ZlS6M
90です。
パソコンを再起動して、.irb_historyをtouchで初期化したのち、
以下を実行しても同じ結果でした。

irb(main):001:0> def test; p "test"; end
=> :test
irb(main):002:0> Enumerable.methods.grep(/test/)
=> [:test]
irb(main):010:0> exit
$ rbenv -v
rbenv 1.1.2
$ rbenv versions
system
* 2.7.1 (set by /Users/someone/.rbenv/version)

別のメソッドも作ってみましたが、結果は同じでした。
irb(main):001:1* def mul(a,b)
irb(main):002:1* a*b
irb(main):003:0> end
=> :mul
irb(main):004:0> Enumerable.methods.grep(/mul/)
=> [:mul]
irb(main):006:0> exit
$ irb
irb(main):001:0> Enumerable.methods.grep(/mul/)
=> []
0096デフォルトの名無しさん (ワントンキン MM9f-bvMg)
垢版 |
2021/02/24(水) 20:38:46.87ID:p2P+ZlS6M
90です。
92さんがおっしゃる通り、環境を作り直すこととします。
私の疑問を受けて、再現性について試していただいた皆様、
ご協力ありがとうございました。
0097デフォルトの名無しさん (オッペケ Sr07-VXi+)
垢版 |
2021/02/24(水) 20:41:24.99ID:MS8741jMr
irb(とpry)でトップレベルで定義するとなんかおかしい

$ cat test.rb
def hoge; end
puts 'public: %p' % [methods.grep(/hoge/)]
puts 'private: %p' % [private_methods.grep(/hoge/)]

$ ruby -v test.rb
ruby 2.6.1p33 (2019-01-30 revision 66950) [x64-mingw32]
public: []
private: [:hoge]

$ irb
irb(main):001:0> load("test.rb")
public: []
private: [:hoge]
=> true
irb(main):002:0> def fuga;end
=> :fuga
irb(main):003:0> puts 'public: %p' % [methods.grep(/fuga/)]
public: [:fuga]
=> nil
irb(main):004:0> puts 'private: %p' % [private_methods.grep(/fuga/)]
private: []
=> nil
0099デフォルトの名無しさん (ワッチョイ de2c-tEpZ)
垢版 |
2021/02/27(土) 23:10:50.88ID:xGn+rZN00
WEB+DB vol.121

Ruby 3 特集、30 ページ分
0100デフォルトの名無しさん (ワッチョイ 692c-3kAG)
垢版 |
2021/03/13(土) 14:19:53.90ID:33EHGK5P0
Ruby on Rails 6 の本を書いている、2人の新刊

Go言語 ハンズオン、掌田津耶乃、2021/3/6
Elixir実践ガイド、黒田努、2021/2/5

Ruby からGoか、Elixirか、どっちへ進むべきか?
mruby, Rust もあるけど
0107デフォルトの名無しさん (オッペケ Sr85-azCS)
垢版 |
2021/03/25(木) 16:55:46.31ID:LuSagST9r
プログラミング言語Crystal、初のメジャーリリースとなるバージョン1.0を公開
0110デフォルトの名無しさん (ワッチョイ 15bb-giyE)
垢版 |
2021/04/02(金) 01:45:05.99ID:6d4XTvSa0
rubyでExcelへデータを出力しようとしているんですが、
どうしてもできないことがあり質問します。

ruby -v 3.0.0p0

rubyでExcelのデータを検索するときはFindを使うと思うのですが、
日付項目(シリアル値)を検索するときはどうすればいいのでしょうか。
以下をやってみましたが、検索できませんでした。

find('3/30') ・・・Excelの表示を指定
find('4321') ・・・シリアル値を指定
0115デフォルトの名無しさん (ワッチョイ 7b35-mU/W)
垢版 |
2021/04/09(金) 09:17:30.32ID:+qPfXmCt0
>>17
on ruby rails
と出力されると思いきや、ruby “on ¥n rails”だって。
なんでだ?
Here Documentの仕様ってどうなってんの?
0119デフォルトの名無しさん (ワッチョイ 4e9f-m7N9)
垢版 |
2021/04/09(金) 22:01:43.18ID:pm4fGgmv0
Loggerで出力する内容を奪い取って、他のメソッド呼び出しにするってどう言う実装したらいいですか?

例えば全てをTest::any::log(msg)を内部的に呼び出して終わるみたいなLoggerを作るにはどうしたらいいですか?

Logger.new(STDERR)だと全て標準エラーに出力ですが、これを全てTest::any::log(msg)の呼び出しで標準エラーには何も出さないloggerを作りたいのです
0120デフォルトの名無しさん (ワッチョイ 6f2c-ORmy)
垢版 |
2021/04/10(土) 02:35:21.72ID:OA/XTa6K0
C:/Ruby25-x64/lib/ruby/2.5.0/fileutils.rb では、
インスタンス変数に、標準エラーを代入してる

@fileutils_output ||= $stderr
@fileutils_output = $stderr

漏れは、それを真似て、
DryRun の時だけ、noop: true, verbose: true を付けて、
標準出力から標準エラーに切り替えるような、モジュールを作っている

module MyFileUtils
@fileutils_output = $stdout

extend self
def f( *args, **options ) # 配列・ハッシュ
p @fileutils_output
@fileutils_output.puts( args, options )
end

module DryRun
include MyFileUtils
@fileutils_output = $stderr

extend self
def f( *args, **options )
super( *args, **options, noop: true, verbose: true )
end
end
end

MyFileUtils.f( 1, 2, a: 8, b: 9 )
MyFileUtils::DryRun.f( 1, 2, a: 8, b: 9 )
0121120 (ワッチョイ 6f2c-ORmy)
垢版 |
2021/04/10(土) 06:15:13.31ID:OA/XTa6K0
Ruby 逆引きハンドブックには、こう書いてある

Logger.new の引数には、ログファイルパスか、
write, close が定義された、IO などのオブジェクトを指定する
レスを投稿する


ニューススポーツなんでも実況