プログラミング言語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/
探検
Ruby 初心者スレッド Part 61 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
2017/08/25(金) 15:59:11.22ID:HsL9LVKJ
402デフォルトの名無しさん
2017/09/25(月) 13:46:59.49ID:1g9PJt6J スレ違い
403デフォルトの名無しさん
2017/09/26(火) 03:49:41.39ID:m0UrTKNQ arrayのpackメソッドってみんな全部覚てる?
俺は量が多くて覚えきれないから、いまいち何ができて何ができないか把握できない
俺は量が多くて覚えきれないから、いまいち何ができて何ができないか把握できない
404デフォルトの名無しさん
2017/09/26(火) 03:52:37.86ID:w3seKs+r packとかそもそも使わない
405デフォルトの名無しさん
2017/09/26(火) 04:26:57.32ID:q4PyBsS5 バイナリいじったり、作ったりするときに使う
その都度リファレンスを読み返すけど
その都度リファレンスを読み返すけど
406デフォルトの名無しさん
2017/09/26(火) 09:37:33.97ID:fZxiOEU0407デフォルトの名無しさん
2017/09/26(火) 21:26:43.24ID:U5HCny0u 使う回数多ければ自然と覚えるだろう
文字列扱うやつなら正規表現とかみたいに
文字列扱うやつなら正規表現とかみたいに
408デフォルトの名無しさん
2017/09/26(火) 23:01:09.68ID:qHxce6jn packフォーマットってある意味暗号だよな
かと言ってFiddle::CStructとかFFI::Structとかは文字列オブジェクトをそのまま扱えないし
それにバイナリデータをいじる時たまにunionを扱いたくなるけど一手間なんだよね
かと言ってFiddle::CStructとかFFI::Structとかは文字列オブジェクトをそのまま扱えないし
それにバイナリデータをいじる時たまにunionを扱いたくなるけど一手間なんだよね
409デフォルトの名無しさん
2017/09/26(火) 23:20:44.46ID:Ij7a6zSN プロトコルの多くがテキスト化してきてるから、packは出番が少なくなってるんだよねー
410デフォルトの名無しさん
2017/09/28(木) 08:04:49.74ID:o7bSKTAB Rubyでファイル群を再帰的にパースして抽出したデータを表計算ソフトで編集後に書き戻す
という処理をする場合に表計算ソフトとのインターフェイスを簡単かつスマートに実装できませんかね?
OSはWindows、Linux、FreeBSD。表計算ソフトはExcel、Libre/OpenOffice、Gnumericを想定します
現状はWindows上でSYLKを経由してLibreOfficeで編集しているのですが、Unicode文字をそのまま
扱えなかったり、SYLKのサポートが不完全だったり、編集の終了の検出が難しかったりして面倒です
CSV/TSVでは書式や数式を扱えないですし、ODFでも編集の終了の検出が難しい問題が残ります
という処理をする場合に表計算ソフトとのインターフェイスを簡単かつスマートに実装できませんかね?
OSはWindows、Linux、FreeBSD。表計算ソフトはExcel、Libre/OpenOffice、Gnumericを想定します
現状はWindows上でSYLKを経由してLibreOfficeで編集しているのですが、Unicode文字をそのまま
扱えなかったり、SYLKのサポートが不完全だったり、編集の終了の検出が難しかったりして面倒です
CSV/TSVでは書式や数式を扱えないですし、ODFでも編集の終了の検出が難しい問題が残ります
411デフォルトの名無しさん
2017/09/28(木) 08:41:02.01ID:Lc06qyoR412デフォルトの名無しさん
2017/09/28(木) 08:48:24.32ID:7AnfF7EJ 表計算ソフトのファイルを何とかしようというのは筋が悪いよね
データとビューを分離するべき
データとビューを分離するべき
413デフォルトの名無しさん
2017/09/28(木) 12:07:21.55ID:jWw+HTna414デフォルトの名無しさん
2017/09/28(木) 23:24:47.20ID:Rgro2LTl 判りにくくてすみません
現状のRubyスクリプト
ファイル群をパースして情報を抽出
SYLKファイルを生成してこれを引数にLibreOffice Calcを起動。スクリプトは待機する
Calcで情報を編集する。このときにセル参照や簡単な数式等を使用する場合がある
編集した情報をSYLKファイルに上書き保存してCalcを終了する
スクリプトが再開しSYLKファイルをパースして情報を取り出す
ファイル群の情報を更新する
な感じです
>>411
最初はTSVを使っていたのですが>>410に書いた制約等を緩和するために今はSYLKを使用しています
>>412
情報を表形式のUIで編集したいです。これを一から作る大変なので既成の表計算ソフトを使えないかなと考え
今のような形になっています
>>413
Excelはライセンスを1つしか持っていないこともあって滅多に使いません(絶対に使わないわけではない)
現状のRubyスクリプト
ファイル群をパースして情報を抽出
SYLKファイルを生成してこれを引数にLibreOffice Calcを起動。スクリプトは待機する
Calcで情報を編集する。このときにセル参照や簡単な数式等を使用する場合がある
編集した情報をSYLKファイルに上書き保存してCalcを終了する
スクリプトが再開しSYLKファイルをパースして情報を取り出す
ファイル群の情報を更新する
な感じです
>>411
最初はTSVを使っていたのですが>>410に書いた制約等を緩和するために今はSYLKを使用しています
>>412
情報を表形式のUIで編集したいです。これを一から作る大変なので既成の表計算ソフトを使えないかなと考え
今のような形になっています
>>413
Excelはライセンスを1つしか持っていないこともあって滅多に使いません(絶対に使わないわけではない)
415デフォルトの名無しさん
2017/09/29(金) 00:38:00.00ID:KC1uJX1K 表にRubyコードをテキストとしてぶち込んで、
後でRubyからeval
後でRubyからeval
416デフォルトの名無しさん
2017/09/29(金) 01:01:10.45ID:c3tXL9dl MVC の、データ部分だけを処理すべき。
View は、そのアプリ(表計算ソフト)独自の規格だから、無理
結局、View の規格を学ぶことは、
自分で表計算ソフトを作ることになり、車輪の再発明となり、
ビジネスロジックとは無関係のことに、開発費を掛けることになる
View は、そのアプリ(表計算ソフト)独自の規格だから、無理
結局、View の規格を学ぶことは、
自分で表計算ソフトを作ることになり、車輪の再発明となり、
ビジネスロジックとは無関係のことに、開発費を掛けることになる
417デフォルトの名無しさん
2017/09/29(金) 01:16:50.93ID:Zb0/fBQl CSVで用が済まないならエクセルVBAでやるのが一番妥当だと言う結論に至った
システムにくっついたスクリプト言語がなんだかんだでマシである
システムにくっついたスクリプト言語がなんだかんだでマシである
418デフォルトの名無しさん
2017/09/29(金) 01:30:05.66ID:RLeXl8wr 表計算アプリからの戻りはプロセスを監視するかファイルを監視するかしかない
Windowsの場合はファイルクローズをイベントとして基本的に拾えないので
定期的にポーリングするかファイル変更イベントを監視してチェックする
Linux系で動かしてinotify使うと楽
でも表計算アプリでの編集は手動だろうから
それが終わったらRubyを起動したんでも良くない? 個人用でしょ?
もしそれも面倒なら最低限のマクロを書いてRubyからwatchしやすくするとかかな
Windowsの場合はファイルクローズをイベントとして基本的に拾えないので
定期的にポーリングするかファイル変更イベントを監視してチェックする
Linux系で動かしてinotify使うと楽
でも表計算アプリでの編集は手動だろうから
それが終わったらRubyを起動したんでも良くない? 個人用でしょ?
もしそれも面倒なら最低限のマクロを書いてRubyからwatchしやすくするとかかな
419デフォルトの名無しさん
2017/09/29(金) 03:05:56.84ID:UluMyDjB >>414
>Calcで情報を編集する
確認するけどこれは手動だよね?
>Calcを終了する
>スクリプトが再開し
「編集の終了の検出」で再開を自動化したいの?
普通に編集後スクリプトを
手動起動するんじゃダメなの?
商業アプリでも他ソフトで編集してから
再起動させるのは普通だと思うけど
もし表計算と何度も往復して面倒とかだったら
1. VBAを使ってエクセルメインで処理する
2. RubyにGUIをつけて編集可能にする
上記のいずれかを考えるが
表計算のGUIを実装するのは非常に大変なので
1の方が圧倒的に楽だと思う
>Calcで情報を編集する
確認するけどこれは手動だよね?
>Calcを終了する
>スクリプトが再開し
「編集の終了の検出」で再開を自動化したいの?
普通に編集後スクリプトを
手動起動するんじゃダメなの?
商業アプリでも他ソフトで編集してから
再起動させるのは普通だと思うけど
もし表計算と何度も往復して面倒とかだったら
1. VBAを使ってエクセルメインで処理する
2. RubyにGUIをつけて編集可能にする
上記のいずれかを考えるが
表計算のGUIを実装するのは非常に大変なので
1の方が圧倒的に楽だと思う
420デフォルトの名無しさん
2017/09/29(金) 05:59:14.07ID:jL38KlQs 表形式のUIで編集したいだけなんだから、GUIはWebブラウザに任せればいいだけじゃん
421デフォルトの名無しさん
2017/09/29(金) 06:25:50.08ID:UluMyDjB Webアプリにすれば連携しやすいが
GUIを実装するのに
JavaScriptが必要になる
JSが使える前提ならアリかもしれないが
やはりエクセルの挙動を再現するのは
ライブラリがあっても大変
GUIを実装するのに
JavaScriptが必要になる
JSが使える前提ならアリかもしれないが
やはりエクセルの挙動を再現するのは
ライブラリがあっても大変
422デフォルトの名無しさん
2017/09/29(金) 07:29:16.17ID:Vf0Ansyt require 'win32ole'
ServiceManager = WIN32OLE.new("com.sun.star.ServiceManager")
StarDesktop = ServiceManager.createInstance("com.sun.star.frame.Desktop")
doc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, [])
#doc = StarDesktop.loadComponentfromUrl( 'file:///D:/Office/OOO/wrk.ods', '_hidden', 0, [])
sheet = doc.sheets.getByIndex(0)
cell = sheet.getCellByPosition(0, 1)
cell = sheet.getCellRangeByName("A2")
sheet.getCellRangeByName("A1").string = "文字"
sheet.getCellRangeByName("B1").value = 123
sheet.getCellRangeByName("B2").value = 654
sheet.getCellRangeByName("B3").formula = "=B1+B2"
p sheet.getCellRangeByName("A1").type
p sheet.getCellRangeByName("B1").type
ServiceManager = WIN32OLE.new("com.sun.star.ServiceManager")
StarDesktop = ServiceManager.createInstance("com.sun.star.frame.Desktop")
doc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, [])
#doc = StarDesktop.loadComponentfromUrl( 'file:///D:/Office/OOO/wrk.ods', '_hidden', 0, [])
sheet = doc.sheets.getByIndex(0)
cell = sheet.getCellByPosition(0, 1)
cell = sheet.getCellRangeByName("A2")
sheet.getCellRangeByName("A1").string = "文字"
sheet.getCellRangeByName("B1").value = 123
sheet.getCellRangeByName("B2").value = 654
sheet.getCellRangeByName("B3").formula = "=B1+B2"
p sheet.getCellRangeByName("A1").type
p sheet.getCellRangeByName("B1").type
423デフォルトの名無しさん
2017/09/29(金) 09:07:46.91ID:xJMWYcO3 やった事ないけどリブレオフィスならpythonでマクロ操作できるんじゃないの?
424デフォルトの名無しさん
2017/09/29(金) 13:30:50.48ID:K1n6MHEs ここまでの書き込みを読めばわかるけど
これだけ話がそれるのを見てもわかる通り
物凄く端的に言えば
出来ない
が回答のようだよ
これだけ話がそれるのを見てもわかる通り
物凄く端的に言えば
出来ない
が回答のようだよ
425デフォルトの名無しさん
2017/09/29(金) 13:52:36.88ID:KC1uJX1K 荒らしはうせろ
426デフォルトの名無しさん
2017/09/29(金) 17:12:08.47ID:/1pN5XFr >>423
出来るけど何をしたいの?
出来るけど何をしたいの?
427デフォルトの名無しさん
2017/09/29(金) 23:02:51.31ID:RLeXl8wr428デフォルトの名無しさん
2017/09/30(土) 10:01:17.83ID:TLzEdb0d 来年のExcelを待とう。ttp://jp.techcrunch.com/2017/09/27/20170926microsoft-excel-is-about-to-get-a-lot-smarter/
429デフォルトの名無しさん
2017/09/30(土) 11:40:05.80ID:XdOHXaSN 本日14時から
ニコニコ動画などで
Excel方眼紙は悪なのか? その是非を問う公開討論会を生中継
2017/09/30 14:00開始 - ニコニコ生放送
ニコニコ動画などで
Excel方眼紙は悪なのか? その是非を問う公開討論会を生中継
2017/09/30 14:00開始 - ニコニコ生放送
430デフォルトの名無しさん
2017/09/30(土) 20:03:10.07ID:auZlLsd0 質問です
ブロックつきで呼び出されたメソッドから、
super をブロックなしで呼び出したいんですが、
どうやればいいんでしょうか?
親クラスに外部イテレータ取得用のメソッドを追加するしかない?
コード例はこんな感じです
ttps://ideone.com/HMVdVD
ブロックつきで呼び出されたメソッドから、
super をブロックなしで呼び出したいんですが、
どうやればいいんでしょうか?
親クラスに外部イテレータ取得用のメソッドを追加するしかない?
コード例はこんな感じです
ttps://ideone.com/HMVdVD
431デフォルトの名無しさん
2017/09/30(土) 20:58:00.31ID:zjhAyoS1 super(&nil)かな。でもeachのEnumeratorだからBのeachが呼ばれるだけだな
432430
2017/09/30(土) 23:06:46.66ID:iQQJc6F+433430
2017/09/30(土) 23:09:29.84ID:iQQJc6F+ あっ 違う
ttps://ideone.com/oNjS8J
これでいいんですね
シンプルだしこれで行きたいと思います
どうもありがとうございました
そして sage 忘れ……
ttps://ideone.com/oNjS8J
これでいいんですね
シンプルだしこれで行きたいと思います
どうもありがとうございました
そして sage 忘れ……
434デフォルトの名無しさん
2017/10/01(日) 09:06:54.01ID:haDSEbeL ジャアアアw
435デフォルトの名無しさん
2017/10/01(日) 17:51:05.47ID:YAYz069J Ruby 4: To Infinity and Beyond // Speaker Deck
https://speakerdeck.com/bbatsov/ruby-4-to-infinity-and-beyond
https://speakerdeck.com/bbatsov/ruby-4-to-infinity-and-beyond
436デフォルトの名無しさん
2017/10/04(水) 16:19:15.38ID:x/lJJY2U rubyの人工知能の本、もっと増えないかな
437デフォルトの名無しさん
2017/10/05(木) 00:30:39.28ID:rJN31A7T 教えてください。
hash = [{"fruits"=>"apple","price"=>"100"},{"fruits"=>"orange","price"=>"50"}]
という風に続いている配列から
オレンジの値段を取り出す場合、
どうしたらいいですか?
hash = [{"fruits"=>"apple","price"=>"100"},{"fruits"=>"orange","price"=>"50"}]
という風に続いている配列から
オレンジの値段を取り出す場合、
どうしたらいいですか?
438デフォルトの名無しさん
2017/10/05(木) 01:02:40.96ID:MJCn4tJ3 ハッシュが入ってる配列にふさわしい名前は少なくともhashではないと思う
irb> fruits_data = [{"fruits"=>"apple","price"=>"100"},{"fruits"=>"orange","price"=>"50"}]
irb> fruits_data.each{|h| p h["price"]}
"100"
"50"
irb> p fruits_data.map{|h| h["price"]}
=> ["100", "50"]
irb> p fruits_data.inject(0){|sum, h| sum += h["price"].to_i}
150
だいたいこんな流れかと
irb> fruits_data = [{"fruits"=>"apple","price"=>"100"},{"fruits"=>"orange","price"=>"50"}]
irb> fruits_data.each{|h| p h["price"]}
"100"
"50"
irb> p fruits_data.map{|h| h["price"]}
=> ["100", "50"]
irb> p fruits_data.inject(0){|sum, h| sum += h["price"].to_i}
150
だいたいこんな流れかと
439デフォルトの名無しさん
2017/10/05(木) 01:07:26.58ID:MJCn4tJ3 すまん寝ながら書いてて要件満たしてなかった
irb> p fruits_data.find{|h| h["fruits"] == "orange"}
{"fruits"=>"orange", "price"=>"50"}
irb> p fruits_data.find{|h| h["fruits"] == "orange"}["price"]
"50"
文字列が嫌ならto_iでもしとけ
irb> p fruits_data.find{|h| h["fruits"] == "orange"}
{"fruits"=>"orange", "price"=>"50"}
irb> p fruits_data.find{|h| h["fruits"] == "orange"}["price"]
"50"
文字列が嫌ならto_iでもしとけ
440デフォルトの名無しさん
2017/10/05(木) 01:13:05.98ID:sXpkOy/U441デフォルトの名無しさん
2017/10/05(木) 01:22:25.13ID:PaSIQ/4V >>437
果物と値段を直接ペアにした方がシンプルになる
answer = ""
fruits_price = {"apple"=>"100","orange"=>"50"}
fruits_price.each do |k,v|
answer = v if k == "orange"
end
p answer #=> 50
書いてたら先を越されてしまった
果物と値段を直接ペアにした方がシンプルになる
answer = ""
fruits_price = {"apple"=>"100","orange"=>"50"}
fruits_price.each do |k,v|
answer = v if k == "orange"
end
p answer #=> 50
書いてたら先を越されてしまった
442デフォルトの名無しさん
2017/10/05(木) 01:37:00.79ID:URIOD7FQ array.find{|i| i[:fruits] == "banana"}&.fetch(:price)
&.[:price]って書ければいいのに。
&.[](:price)は読みにくいからfetchで
&.[:price]って書ければいいのに。
&.[](:price)は読みにくいからfetchで
443デフォルトの名無しさん
2017/10/05(木) 07:56:55.79ID:rJN31A7T444デフォルトの名無しさん
2017/10/05(木) 22:52:18.95ID:RWFlOlgJ Effective Ruby の項目10に書いてあるけど、
構造化データを扱う際、Hashの配列よりも、
クラスまたは、Struct(簡易クラス、クラスジェネレータ)のような専用の型を、使った方がいい
data[:name]
キー名のような実装の詳細が、隠蔽されず表に出てくる。
また、存在しないキーは、nilとなる
Person = Struct.new(:name, :address) #定数に代入
data = Person.new("foo", "fugafuga")
data.name
Structでは属性になるから、getter, setter も付いているし、
存在しない属性名でアクセスすると、NoMethodErrorになる
構造化データを扱う際、Hashの配列よりも、
クラスまたは、Struct(簡易クラス、クラスジェネレータ)のような専用の型を、使った方がいい
data[:name]
キー名のような実装の詳細が、隠蔽されず表に出てくる。
また、存在しないキーは、nilとなる
Person = Struct.new(:name, :address) #定数に代入
data = Person.new("foo", "fugafuga")
data.name
Structでは属性になるから、getter, setter も付いているし、
存在しない属性名でアクセスすると、NoMethodErrorになる
445デフォルトの名無しさん
2017/10/07(土) 15:27:41.53ID:AWMSypLQ ちまたのRubyハッカソンってどうやって見つけるの?
446デフォルトの名無しさん
2017/10/08(日) 11:34:25.59ID:FYLwhXQv Rubyの話題っていうか、rspecなんだけどさ、
すごいもやもや感がある。
rspec便利なんだけど、なんで通常のプログラミングとは
ことなった技術を使わないといけないだのだろう?
アサーションとかモックとか
アサーションって要は比較命令だろ?
モックは要はクラスの継承だろ?
もちろんテストのための機能(エラーが起きた時の情報表示)が
ついてるのはわかるよ。でもそれは本質的なことじゃなく
比較命令や継承ができればいいはず。
つまり通常のプログラミング技術と同じ書き方でテストコードも書けるはず。
テストコードが読みやすいようなDSLになっているというのなら
それを通常のプログラミングでも使えばいいやん?読みやすくなる。
なんでテスト用に特殊な書き方を覚えなきゃならないんだ?
すごいもやもや感がある。
rspec便利なんだけど、なんで通常のプログラミングとは
ことなった技術を使わないといけないだのだろう?
アサーションとかモックとか
アサーションって要は比較命令だろ?
モックは要はクラスの継承だろ?
もちろんテストのための機能(エラーが起きた時の情報表示)が
ついてるのはわかるよ。でもそれは本質的なことじゃなく
比較命令や継承ができればいいはず。
つまり通常のプログラミング技術と同じ書き方でテストコードも書けるはず。
テストコードが読みやすいようなDSLになっているというのなら
それを通常のプログラミングでも使えばいいやん?読みやすくなる。
なんでテスト用に特殊な書き方を覚えなきゃならないんだ?
447デフォルトの名無しさん
2017/10/08(日) 12:00:51.07ID:qef5wK+C TDD, BDD とか、流行っている
Ruby は、DSL に強いから、常に流行の最先端。
2, 3年遅れて、他の言語に取り入れられる
Ruby は、DSL に強いから、常に流行の最先端。
2, 3年遅れて、他の言語に取り入れられる
448デフォルトの名無しさん
2017/10/08(日) 12:08:41.89ID:21EEh8/s BDDを実現するためにあんな「変」な書き方になってる
どうしても性に合わなきゃフツーのユニットテストもあるよ
ただそういう「メソッドの戻り値が妥当かテストするテストの一覧」だけではテストたり得ないという考え方が主流
個人的には好きよ、はみ出ないことを保証する自分向け補正レールとしての大量のユニットテスト群を高速でぐるぐるするやつ
あの時代に戻れたらいいなと思うことはある
どうしても性に合わなきゃフツーのユニットテストもあるよ
ただそういう「メソッドの戻り値が妥当かテストするテストの一覧」だけではテストたり得ないという考え方が主流
個人的には好きよ、はみ出ないことを保証する自分向け補正レールとしての大量のユニットテスト群を高速でぐるぐるするやつ
あの時代に戻れたらいいなと思うことはある
449デフォルトの名無しさん
2017/10/08(日) 13:05:22.73ID:FYLwhXQv >>477
Ruby TUEEEEはどうでもいいんだけど、そのレス見てRubyがなまじDSLに
強いからRubyという言語仕様の範囲内(内部DSL)にした結果
通常のプログラミングと異なる技術を使ってしまうんじゃないかって思った
いやちょっと違うかもな。通常のプログラミングで使う内部DSLとテスト用の
内部DSLが異なるという問題かもしれない。DSLといっても内部であればRubyという
言語でしかないので言い回しの違いでしかないかもしれないけど
TDDとかBDDとかshould系とかexpect系とか通常のアサーションとか正直どれもテストとしては
読みづらいと思う。英語としては読みやすいかもしれないけど、テストとしてはということ
どういうことかというと、テスト仕様書ってよくマトリクス(二次元の表)で書くでしょ?
日本語とか英語じゃなくて、マトリクスの形でテスト仕様書書いちゃうんだから
じゃあテストコードもマトリクスであるべきだよ。エクセルの表がまんまテストコードになる感じ
たぶんこの時点でRubyによる内部DSLとして書くのは無理なんじゃないかな
Rubyの表現能力を超えてしまう。無理にやっても読みづらくなる
そしてこのマトリクス。テストコード(定義書?データ?)はエンドユーザーでも
読みやすい(専用のテスト内容ビューワーを作っても良い)と同時にそれが
そのままアプリケーションのコードとして使えればよくね?
テストを書くだけでアプリができるとはいわない。それは不可能。でも減らすことはできる。
エンドユーザーがテストを目視で確認してOKだして、それがそのままアプリで使われれば楽じゃん?
このパラメータには英数字しか使えません。英数字しか入れられないようにチェックコード書きました
英数字しかうけつけないことを証明するテストコード書きました。頑張って英語風にしました。
そこまでやってもエンドユーザーはそれ見て判断できません。これじゃやっぱり無駄に感じる
俺が今話ししてるのはだいたい「定義」の部分なんだよね。「処理」ではない
処理に関してのテストはいままで通りやるしか無いと思うけど
定義に関するテストは(エンドユーザーにもわかりやすい形で)テストコードを書いて
それがそのまま通常のプログラミングのコードとして使えると思うんだよ
モックもクラス「定義」だしね
Ruby TUEEEEはどうでもいいんだけど、そのレス見てRubyがなまじDSLに
強いからRubyという言語仕様の範囲内(内部DSL)にした結果
通常のプログラミングと異なる技術を使ってしまうんじゃないかって思った
いやちょっと違うかもな。通常のプログラミングで使う内部DSLとテスト用の
内部DSLが異なるという問題かもしれない。DSLといっても内部であればRubyという
言語でしかないので言い回しの違いでしかないかもしれないけど
TDDとかBDDとかshould系とかexpect系とか通常のアサーションとか正直どれもテストとしては
読みづらいと思う。英語としては読みやすいかもしれないけど、テストとしてはということ
どういうことかというと、テスト仕様書ってよくマトリクス(二次元の表)で書くでしょ?
日本語とか英語じゃなくて、マトリクスの形でテスト仕様書書いちゃうんだから
じゃあテストコードもマトリクスであるべきだよ。エクセルの表がまんまテストコードになる感じ
たぶんこの時点でRubyによる内部DSLとして書くのは無理なんじゃないかな
Rubyの表現能力を超えてしまう。無理にやっても読みづらくなる
そしてこのマトリクス。テストコード(定義書?データ?)はエンドユーザーでも
読みやすい(専用のテスト内容ビューワーを作っても良い)と同時にそれが
そのままアプリケーションのコードとして使えればよくね?
テストを書くだけでアプリができるとはいわない。それは不可能。でも減らすことはできる。
エンドユーザーがテストを目視で確認してOKだして、それがそのままアプリで使われれば楽じゃん?
このパラメータには英数字しか使えません。英数字しか入れられないようにチェックコード書きました
英数字しかうけつけないことを証明するテストコード書きました。頑張って英語風にしました。
そこまでやってもエンドユーザーはそれ見て判断できません。これじゃやっぱり無駄に感じる
俺が今話ししてるのはだいたい「定義」の部分なんだよね。「処理」ではない
処理に関してのテストはいままで通りやるしか無いと思うけど
定義に関するテストは(エンドユーザーにもわかりやすい形で)テストコードを書いて
それがそのまま通常のプログラミングのコードとして使えると思うんだよ
モックもクラス「定義」だしね
450デフォルトの名無しさん
2017/10/08(日) 14:43:14.66ID:dWIEdLJn じゃあとりあえず、そのやりかたを例示したら。
現行BDDへの不満はもうわかったので。
現行BDDへの不満はもうわかったので。
451デフォルトの名無しさん
2017/10/08(日) 15:14:06.57ID:93IJP3PA RSpecはテストを構造化しやすいのが良かったが
3からmatcherの文法がクソになったので基本使わない
3からmatcherの文法がクソになったので基本使わない
452デフォルトの名無しさん
2017/10/08(日) 17:04:31.77ID:X3i4AnjM >>446
>なんでテスト用に特殊な書き方を覚えなきゃならないんだ?
それがDSLだから
たとえばHTMLやSQLもRubyやJSとはぜんぜん違うだろ
ただオレは実はMiniTest使ってる
RSpecが大きいフレームワークなので使いこなすの大変
RSpecはRakeやRailsみたいに独自の世界観築いてる
RubyでDSL使った大きめのフレームワークはみんなそう
使いやすいのはメリットだけど
学習コスト大きくなるデメリットもある
まあ個々に選べばいんじゃね?
>なんでテスト用に特殊な書き方を覚えなきゃならないんだ?
それがDSLだから
たとえばHTMLやSQLもRubyやJSとはぜんぜん違うだろ
ただオレは実はMiniTest使ってる
RSpecが大きいフレームワークなので使いこなすの大変
RSpecはRakeやRailsみたいに独自の世界観築いてる
RubyでDSL使った大きめのフレームワークはみんなそう
使いやすいのはメリットだけど
学習コスト大きくなるデメリットもある
まあ個々に選べばいんじゃね?
453デフォルトの名無しさん
2017/10/08(日) 17:43:35.10ID:FOJ8Xq1X >>450
例示は5ちゃんねるとは別の場所でやってる or これからやる
ここではしない。雑多なアイデア?みたいなのを書いて
まあ誰か突っ込んでくれw
モック大嫌いなんだけど、今考えていて気づいたことが有る。
モックって形を変えた引き数なんだな。
テストする時のマトリクスとして考えれば、引数列とは別に
例えばAPI列があってその戻り値が○の場合なんて形で書くと思う
つまりArrange、Act、Assert(AAA)におけるArrange部分だな。
【アンチパターン】Arrange、Act、Assert(AAA)を意識できていないRSpecのコード例とその対処法
https://qiita.com/jnchito/items/91779b55cae0f4915da5
モックを使う使わないに限らず、マトリクス(二次元の表形式)で
テスト仕様書(パターン)は作れると思う
あぁ、そうかrspec等は、このパターンを記述しづらいんだ。
describe、contextなどでパターンを書くことができるけど一覧性がない。
(マトリクスで書きづらいもののために)describe、contextみたいなものはあってもいいけど、
テストパターン(結果含む)とテスト内容はファイルごと分けるべきなんだろうな。
あとモックを使った場合、通常はテストパターンがあればいいと思うんだけど
呼び出し回数や引数テスト(つまりreceive(:hoge).with(引数)).at_least(回数).timesみたいなやつ)
なことをしたいことも有る。単体テストとして考えれば他のモジュール呼び出しだから理解はできるけど
どうみても内部実装に依存したテストだから嫌いだしわかりづらい
こういのはAAAと独立させて、内部実装のテストだって割り切って別に書くべきなんだろう。
マトリクスの表を用意して、引数列、テスト結果列とは別に、内部処理列を作って、
どういった関数が呼び出されるかを書いていく
例示は5ちゃんねるとは別の場所でやってる or これからやる
ここではしない。雑多なアイデア?みたいなのを書いて
まあ誰か突っ込んでくれw
モック大嫌いなんだけど、今考えていて気づいたことが有る。
モックって形を変えた引き数なんだな。
テストする時のマトリクスとして考えれば、引数列とは別に
例えばAPI列があってその戻り値が○の場合なんて形で書くと思う
つまりArrange、Act、Assert(AAA)におけるArrange部分だな。
【アンチパターン】Arrange、Act、Assert(AAA)を意識できていないRSpecのコード例とその対処法
https://qiita.com/jnchito/items/91779b55cae0f4915da5
モックを使う使わないに限らず、マトリクス(二次元の表形式)で
テスト仕様書(パターン)は作れると思う
あぁ、そうかrspec等は、このパターンを記述しづらいんだ。
describe、contextなどでパターンを書くことができるけど一覧性がない。
(マトリクスで書きづらいもののために)describe、contextみたいなものはあってもいいけど、
テストパターン(結果含む)とテスト内容はファイルごと分けるべきなんだろうな。
あとモックを使った場合、通常はテストパターンがあればいいと思うんだけど
呼び出し回数や引数テスト(つまりreceive(:hoge).with(引数)).at_least(回数).timesみたいなやつ)
なことをしたいことも有る。単体テストとして考えれば他のモジュール呼び出しだから理解はできるけど
どうみても内部実装に依存したテストだから嫌いだしわかりづらい
こういのはAAAと独立させて、内部実装のテストだって割り切って別に書くべきなんだろう。
マトリクスの表を用意して、引数列、テスト結果列とは別に、内部処理列を作って、
どういった関数が呼び出されるかを書いていく
454デフォルトの名無しさん
2017/10/08(日) 17:52:31.79ID:FOJ8Xq1X たとえば内部処理列に書くテストコードは
マトリックスの1行目を実行した場合、内部処理として
hoge.foo()
hage.bar(1,2,3)
tsuru.baz("aaa")
みたいに縦書きで書いていければいいんじゃないかな?
こういう処理が実行されることって。
あー、そうかrspecだと
Arrangeに相当する部分と
内部実装のテストがごっちゃになってるんだな。
マトリックスの1行目を実行した場合、内部処理として
hoge.foo()
hage.bar(1,2,3)
tsuru.baz("aaa")
みたいに縦書きで書いていければいいんじゃないかな?
こういう処理が実行されることって。
あー、そうかrspecだと
Arrangeに相当する部分と
内部実装のテストがごっちゃになってるんだな。
455デフォルトの名無しさん
2017/10/08(日) 17:57:45.59ID:FOJ8Xq1X テスト仕様書ってエクセルがよく使われるけど、
それと同時にエクセルで書くなともいわれる。
ようは表計算としてとして使ってないからなわけだけど、
じゃあ表計算機能をなくしたものを作れば良いんじゃないかな
それと同時にエクセルで書くなともいわれる。
ようは表計算としてとして使ってないからなわけだけど、
じゃあ表計算機能をなくしたものを作れば良いんじゃないかな
456デフォルトの名無しさん
2017/10/08(日) 18:11:17.54ID:FOJ8Xq1X ここまではテストパターンをどうやって書くかの話で
rspecでは一覧性がないから適していないという結論で良いんだろう。
これは別ファイルにするということで、describeとcontextとitあたりの
存在は消えたことだろう。
残ってるのはテストパターンではなくテスト内容。
expectとかそこらへん。これがまたRubyの通常のコードと
テストコードで書き方がぜんぜん違うってのが残ってるんだよな。
とここまで書いたが、あれ?テスト結果もマトリクスの
テスト結果列に書き込むよな?
テストコードのためにDSL(expectとか)を覚えなきゃいけないんって
本質的な問題は何なんだ?
テスト結果には、○○が××であること を
○○ == ×× みたいに書けるではないか?
あー、そうか。to be eq みたいに書かないと読みづらい(誰が?)という問題か。
to be eq みたいな構文いらんな。代わりにテストで使える命令のサブセット定義すればいい
そして専用のビューワーを使って見た時は、そのサブセット命令を日本語なりに置き換える。
WISYWIGみたいにどちらで書いても相互反映するのもいいだろう。
rspecでは一覧性がないから適していないという結論で良いんだろう。
これは別ファイルにするということで、describeとcontextとitあたりの
存在は消えたことだろう。
残ってるのはテストパターンではなくテスト内容。
expectとかそこらへん。これがまたRubyの通常のコードと
テストコードで書き方がぜんぜん違うってのが残ってるんだよな。
とここまで書いたが、あれ?テスト結果もマトリクスの
テスト結果列に書き込むよな?
テストコードのためにDSL(expectとか)を覚えなきゃいけないんって
本質的な問題は何なんだ?
テスト結果には、○○が××であること を
○○ == ×× みたいに書けるではないか?
あー、そうか。to be eq みたいに書かないと読みづらい(誰が?)という問題か。
to be eq みたいな構文いらんな。代わりにテストで使える命令のサブセット定義すればいい
そして専用のビューワーを使って見た時は、そのサブセット命令を日本語なりに置き換える。
WISYWIGみたいにどちらで書いても相互反映するのもいいだろう。
457デフォルトの名無しさん
2017/10/08(日) 18:37:43.20ID:FOJ8Xq1X バリデーション部分は実は前からアイデアがあって、
Railsとかこんな感じで書くわけだけど、
https://railsguides.jp/active_record_validations.html
こんなのは一切廃止して、言語非依存の
YAMLとかでバリデーション定義ファイルを作ればいいと思ってる。
そしてモデルでその定義ファイルを参照することもできるし、
APIからも参照することができる。関数からも参照することができる。
言語非依存ということは同じファイルをJavaScriptからも参照できるので
クライアントサイドのバリデーションも同時に定義できる。
ここで俺がいいたいことの1つとして、正規表現をバリデーション定義に
直接書くのはやめようということ。なぜなら技術的な内容過ぎて
エンドユーザーにはわからないから。
正規表現の代わりに独自の関数を使えば事足りる。
複数の条件や現在のデータも考慮しなければいけないものなどは
バリデーション定義ファイルでは実現できないかもしれないけど
重要なのは完璧にすることではなく無駄を減らすこと
またバリデーション定義に似たものとして
権限管理ファイルってのも考えられる。
なるべくエンドユーザーでも直接みれるようにして、
それをそのままプログラムに組み込めるようにしたい
Railsとかこんな感じで書くわけだけど、
https://railsguides.jp/active_record_validations.html
こんなのは一切廃止して、言語非依存の
YAMLとかでバリデーション定義ファイルを作ればいいと思ってる。
そしてモデルでその定義ファイルを参照することもできるし、
APIからも参照することができる。関数からも参照することができる。
言語非依存ということは同じファイルをJavaScriptからも参照できるので
クライアントサイドのバリデーションも同時に定義できる。
ここで俺がいいたいことの1つとして、正規表現をバリデーション定義に
直接書くのはやめようということ。なぜなら技術的な内容過ぎて
エンドユーザーにはわからないから。
正規表現の代わりに独自の関数を使えば事足りる。
複数の条件や現在のデータも考慮しなければいけないものなどは
バリデーション定義ファイルでは実現できないかもしれないけど
重要なのは完璧にすることではなく無駄を減らすこと
またバリデーション定義に似たものとして
権限管理ファイルってのも考えられる。
なるべくエンドユーザーでも直接みれるようにして、
それをそのままプログラムに組み込めるようにしたい
458デフォルトの名無しさん
2017/10/08(日) 22:48:32.17ID:ptFQWO2G >>457
> なぜなら技術的な内容過ぎてエンドユーザーにはわからないから。
え?Railsは技術者が使うものでしょ?
Railsは決して「誰でもWebアプリ書けます」みたいなWAFを目指してるわけじゃないんだし
正規表現すら使えないような技術者に媚びる必要性は一切ないと思うんだけど
> なぜなら技術的な内容過ぎてエンドユーザーにはわからないから。
え?Railsは技術者が使うものでしょ?
Railsは決して「誰でもWebアプリ書けます」みたいなWAFを目指してるわけじゃないんだし
正規表現すら使えないような技術者に媚びる必要性は一切ないと思うんだけど
459デフォルトの名無しさん
2017/10/09(月) 03:55:05.15ID:YU1H7ndt 厨房って連投しないと死ぬ病気なのか?
460デフォルトの名無しさん
2017/10/10(火) 00:12:42.64ID:DgsA/W7P %bで ASCII_8BITの文字列リテラル作れるようにして
461デフォルトの名無しさん
2017/10/10(火) 01:17:14.00ID:nyY9mfF7 "\xA5もじれつぅ〜〜".bみたいに.bメソッドじゃあ物足りない?
462デフォルトの名無しさん
2017/10/10(火) 01:39:18.83ID:DgsA/W7P frozenが当たり前みたいな風潮があるから
463デフォルトの名無しさん
2017/10/10(火) 02:10:16.84ID:nyY9mfF7464デフォルトの名無しさん
2017/10/10(火) 02:27:20.63ID:8uFKWlnU でもruby3からデフォになっちゃうでしょ
465デフォルトの名無しさん
2017/10/10(火) 03:22:52.35ID:ACpNi8fa Freeze化はJava化の始まり
466デフォルトの名無しさん
2017/10/10(火) 03:43:43.69ID:FbHCJRcA 文字列をfreezeしない理由なんて無い
関数型プログラミングを勉強しろよ
関数型プログラミングを勉強しろよ
467デフォルトの名無しさん
2017/10/10(火) 12:56:37.76ID:b+0lfNgt 何点か質問させていただいてよろしいでしょうか?
現在「Markdown → HTML 変換をする掲示板」のような CGI を練習がてら作成しています。
変換部を全部自作するのは難しいのではないかと思ったので、既存のライブラリを使用しようと思ったのですが、
種類が多すぎる上、Rails 関係のトピックばかりで検索してもいまいち判断に困ります。
以下の条件を満たす適当なものをご存じでしたらご教示願えませんでしょうか?
1. GFM 記法対応(シンタックスハイライトは不要)
2. 使用法は簡単な方が好ましい
3. 高速であったり多機能であったりする必要はない
同時に、Redcarpet を試しに使ってみようと思ったのですが、
以下のような結果となってしまい正確にインストールできません。原因など分かりますでしょうか?
(本文長すぎと怒られたので次の書き込みに続きます)
現在「Markdown → HTML 変換をする掲示板」のような CGI を練習がてら作成しています。
変換部を全部自作するのは難しいのではないかと思ったので、既存のライブラリを使用しようと思ったのですが、
種類が多すぎる上、Rails 関係のトピックばかりで検索してもいまいち判断に困ります。
以下の条件を満たす適当なものをご存じでしたらご教示願えませんでしょうか?
1. GFM 記法対応(シンタックスハイライトは不要)
2. 使用法は簡単な方が好ましい
3. 高速であったり多機能であったりする必要はない
同時に、Redcarpet を試しに使ってみようと思ったのですが、
以下のような結果となってしまい正確にインストールできません。原因など分かりますでしょうか?
(本文長すぎと怒られたので次の書き込みに続きます)
468デフォルトの名無しさん
2017/10/10(火) 13:17:56.78ID:b+0lfNgt (>>467 の続き)
NG ワードを特定できませんでした……
https://agree.5ch.net/test/read.cgi/mango/1507328607/52
上記書き込みのような結果に終わってしまいます。
他のライブラリを gem 経由でインストールする際には正常に動くのですが、
何が問題だかよろしければご教示ください。
NG ワードを特定できませんでした……
https://agree.5ch.net/test/read.cgi/mango/1507328607/52
上記書き込みのような結果に終わってしまいます。
他のライブラリを gem 経由でインストールする際には正常に動くのですが、
何が問題だかよろしければご教示ください。
469デフォルトの名無しさん
2017/10/10(火) 13:38:26.67ID:laLamLaH 記法が増えるのが好ましくないと言ってしまうと
極端な話、ifとwhileでだいたい済んじゃうんじゃないか
よく使われるから専用の記法を設ける
使いたくないなら使わなければいい
極端な話、ifとwhileでだいたい済んじゃうんじゃないか
よく使われるから専用の記法を設ける
使いたくないなら使わなければいい
470デフォルトの名無しさん
2017/10/10(火) 14:02:36.65ID:8V61cfLq >>468
理由もエラーも書いてある通りだと思うのだが
詳細なエラーはgem_make.outに書いてある
コンパイラがないか必要な開発用ライブラリがないかどっちかだろうな
稀に手元のgemバージョンがインストールパッケージの想定より新しすぎるというパターンもある
理由もエラーも書いてある通りだと思うのだが
詳細なエラーはgem_make.outに書いてある
コンパイラがないか必要な開発用ライブラリがないかどっちかだろうな
稀に手元のgemバージョンがインストールパッケージの想定より新しすぎるというパターンもある
471デフォルトの名無しさん
2017/10/10(火) 14:09:04.55ID:W/iVdWKx >>467
そんなもんpandocでも呼べば終わりでしょ
そんなもんpandocでも呼べば終わりでしょ
472デフォルトの名無しさん
2017/10/10(火) 19:17:55.04ID:QUMIjiIQ >>467
・library rdoc/markdown (Ruby 2.4.0)
https://docs.ruby-lang.org/ja/latest/library/rdoc=2fmarkdown.html
Ruby標準ドキュメンテーションツールの RDoc くらいは使ったことがあるよね?
RDoc でも当然だけど markdown は使えるのだから、真っ先にそれを読むべきじゃねえのかと
・library rdoc/markdown (Ruby 2.4.0)
https://docs.ruby-lang.org/ja/latest/library/rdoc=2fmarkdown.html
Ruby標準ドキュメンテーションツールの RDoc くらいは使ったことがあるよね?
RDoc でも当然だけど markdown は使えるのだから、真っ先にそれを読むべきじゃねえのかと
473デフォルトの名無しさん
2017/10/10(火) 21:46:18.83ID:b+0lfNgt >>469
インライン要素は簡単ですけど、ブロック要素が全体的にややこしくないですか?
Marked.js のソースを読んでみたのですが、何をしてるのか分からなくなって……
>>470
あ、そちらを乗せ忘れてました
現在スマホなので確認できませんが、何かが足りないとかいう感じじゃなくて見たことのないエラーでした
検索してみたのですが英語のフォーラムばかりでちょっと分からなかったです
>>471
これって Ruby に組み込めるんですか?
独立したツールのように思えるのですが
>>472
すみません、RDoc は使う機会がなくてほとんど分かりません
RDoc::Markdown の存在は知っていたのですが使い方がよく分からず、
調べてみたら使い物にならないみたいな記事があったので鵜呑みにしていました
上記の目的だとこちらでも問題ないのでしょうか?
インライン要素は簡単ですけど、ブロック要素が全体的にややこしくないですか?
Marked.js のソースを読んでみたのですが、何をしてるのか分からなくなって……
>>470
あ、そちらを乗せ忘れてました
現在スマホなので確認できませんが、何かが足りないとかいう感じじゃなくて見たことのないエラーでした
検索してみたのですが英語のフォーラムばかりでちょっと分からなかったです
>>471
これって Ruby に組み込めるんですか?
独立したツールのように思えるのですが
>>472
すみません、RDoc は使う機会がなくてほとんど分かりません
RDoc::Markdown の存在は知っていたのですが使い方がよく分からず、
調べてみたら使い物にならないみたいな記事があったので鵜呑みにしていました
上記の目的だとこちらでも問題ないのでしょうか?
474デフォルトの名無しさん
2017/10/10(火) 22:01:55.62ID:ACpNi8fa475デフォルトの名無しさん
2017/10/10(火) 22:40:27.88ID:nyY9mfF7 >>473
markdownをrdocで変換するサンプル
テーブルは使えないし、他に足りない機能があるのかも未確認だけど
機能的に充分かどうかは君の方でいろいろ試すといいよ
require "rdoc"
require "rdoc/markdown"
filename = "README.md"
md = File.read(filename)
doc = RDoc::Markdown.parse(md)
opts = RDoc::Options.new
converter = RDoc::Markup::ToHtml.new(opts)
html = converter.convert(doc)
puts html
markdownをrdocで変換するサンプル
テーブルは使えないし、他に足りない機能があるのかも未確認だけど
機能的に充分かどうかは君の方でいろいろ試すといいよ
require "rdoc"
require "rdoc/markdown"
filename = "README.md"
md = File.read(filename)
doc = RDoc::Markdown.parse(md)
opts = RDoc::Options.new
converter = RDoc::Markup::ToHtml.new(opts)
html = converter.convert(doc)
puts html
476デフォルトの名無しさん
2017/10/10(火) 22:43:27.37ID:nyY9mfF7 >>466
rubyで関数型プログラミングを勉強しろって、何の冗談だ?
しかもfreezeするのは文字列だけにするとか中途半端だな
『あらゆるオブジェクトをfreezeしない理由なんて無い』くらい言えよ
rubyで関数型プログラミングを勉強しろって、何の冗談だ?
しかもfreezeするのは文字列だけにするとか中途半端だな
『あらゆるオブジェクトをfreezeしない理由なんて無い』くらい言えよ
477デフォルトの名無しさん
2017/10/10(火) 22:58:25.38ID:b+0lfNgt478デフォルトの名無しさん
2017/10/10(火) 23:30:33.64ID:YB5j1JpR >Markdown → HTML 変換をする
これを行うアプリは、無数にあるから、自作する意味はない
Python のSphinx とか
これを行うアプリは、無数にあるから、自作する意味はない
Python のSphinx とか
479デフォルトの名無しさん
2017/10/10(火) 23:45:15.56ID:ACpNi8fa 練習ならむしろ自作しないと意味ない
480デフォルトの名無しさん
2017/10/11(水) 02:12:44.96ID:/FuCu7BT >>476
> rubyで関数型プログラミングを勉強しろって、何の冗談だ?
どうぞよんでくださいねw
可変性の回避 ― Rubyへの関数型プログラミングスタイルの適用
http://postd.cc/avoid-mutation-functional-style-in-ruby/
> rubyで関数型プログラミングを勉強しろって、何の冗談だ?
どうぞよんでくださいねw
可変性の回避 ― Rubyへの関数型プログラミングスタイルの適用
http://postd.cc/avoid-mutation-functional-style-in-ruby/
481デフォルトの名無しさん
2017/10/11(水) 06:27:37.55ID:2F1JnP4A482デフォルトの名無しさん
2017/10/11(水) 22:45:20.73ID:1IDk9wqH >>480
> 関数型プログラミングを勉強しろよ
って言っておきながら出して来たのが
> 可変性の回避 ― Rubyへの関数型プログラミングスタイルの適用
かよ。ほんと、なんの冗談だ?
そういう事は組織内のコーディング規約で決めればいい事で、
緩いプログラミングをしたくてrubyをいじってる俺に押し付けるな
それに全てのオブジェクトを不変なものとして扱えって書いてあるのに
ことさらに文字列だけをあげつらって
> 文字列をfreezeしない理由なんて無い
とかマジでお前が何を理解してるのか心配になりますね
> 関数型プログラミングを勉強しろよ
って言っておきながら出して来たのが
> 可変性の回避 ― Rubyへの関数型プログラミングスタイルの適用
かよ。ほんと、なんの冗談だ?
そういう事は組織内のコーディング規約で決めればいい事で、
緩いプログラミングをしたくてrubyをいじってる俺に押し付けるな
それに全てのオブジェクトを不変なものとして扱えって書いてあるのに
ことさらに文字列だけをあげつらって
> 文字列をfreezeしない理由なんて無い
とかマジでお前が何を理解してるのか心配になりますね
483デフォルトの名無しさん
2017/10/12(木) 02:12:49.23ID:bkFDlrr0 >>480
なんかのインスタンスを書き換えるの御法度、全部newでやれ、なんて記事出されても
新しい嫌がらせだなぁって思った
この記事の人の言ってることを正しいとするなら、Stringだとこうするしかないかも
temp_string = String.new(OldString, "append_a")
new_string = String.new(temp_string, "append_b")
前衛的なご発想をお持ちのようで
なんかのインスタンスを書き換えるの御法度、全部newでやれ、なんて記事出されても
新しい嫌がらせだなぁって思った
この記事の人の言ってることを正しいとするなら、Stringだとこうするしかないかも
temp_string = String.new(OldString, "append_a")
new_string = String.new(temp_string, "append_b")
前衛的なご発想をお持ちのようで
484デフォルトの名無しさん
2017/10/12(木) 02:13:49.80ID:bkFDlrr0 なんかキャメルとスネーク混ざったのなんでだろう、俺
JavaのStringBuilder思い出してたかも
JavaのStringBuilder思い出してたかも
485デフォルトの名無しさん
2017/10/12(木) 02:23:49.19ID:njn1yLjW >>483
"a" でも結局はnewしてるんで同じことだよ。
"a" でも結局はnewしてるんで同じことだよ。
486デフォルトの名無しさん
2017/10/12(木) 02:29:42.04ID:bkFDlrr0 >>485
ん、記事だと「 "a" + "b"」できるよとか書いてるのみてないのかしら
たぶん「そんなめんどくさい記法はいらね」ってレスかと思ったんだけど
となるとメモリ周りの扱いでイミュータブルかそうでないかの利点を挙げてもらわないといかんわね
ん、記事だと「 "a" + "b"」できるよとか書いてるのみてないのかしら
たぶん「そんなめんどくさい記法はいらね」ってレスかと思ったんだけど
となるとメモリ周りの扱いでイミュータブルかそうでないかの利点を挙げてもらわないといかんわね
487デフォルトの名無しさん
2017/10/12(木) 02:34:26.64ID:bkFDlrr0 たぶんシャローとかディープとかで足かまれるか
パフォーマンス問題のチューンでもなければ
すっげーどうでもいいのでさっさと動け
って話になりそうな気もするけど(90%の問題はコレ)
パフォーマンス問題のチューンでもなければ
すっげーどうでもいいのでさっさと動け
って話になりそうな気もするけど(90%の問題はコレ)
488デフォルトの名無しさん
2017/10/12(木) 02:36:38.72ID:bkFDlrr0 パフォーマンスの問題はchefかansibleでもありゃなんとでもなるでそ、サーバ乱設
chefが必要になるほど大規模な話にかかわったことないのがアレだけど orz
chefが必要になるほど大規模な話にかかわったことないのがアレだけど orz
489デフォルトの名無しさん
2017/10/12(木) 02:39:37.05ID:D7OLf+6g Rubyでゴリゴリの関数型で書く気しない
Rubyは動的型付けだから
コンパイラの型チェックなどのメリットが少なく
柔軟性を失って書きにくくなるデメリットが残る
Rubyは動的型付けだから
コンパイラの型チェックなどのメリットが少なく
柔軟性を失って書きにくくなるデメリットが残る
490デフォルトの名無しさん
2017/10/12(木) 02:42:27.30ID:njn1yLjW >>486
> ん、記事だと「 "a" + "b"」できるよとか書いてるのみてないのかしら
それがなんなん?
それは "a" という文字列を newして "b" という文字列をnewして
オブジェクト同士を加算する(イコール +メソッドを出している)という
意味のシンタックスシュガーなんだけど?
> ん、記事だと「 "a" + "b"」できるよとか書いてるのみてないのかしら
それがなんなん?
それは "a" という文字列を newして "b" という文字列をnewして
オブジェクト同士を加算する(イコール +メソッドを出している)という
意味のシンタックスシュガーなんだけど?
491デフォルトの名無しさん
2017/10/12(木) 02:52:30.38ID:bkFDlrr0 >>490
言い方が悪かったのかもしれんが
「イミュータブルであると、なぜ、誰にとって、どううれしいのか」
を説明してくれって言ってるわけだが
シンタックスシュガーとかぶっちゃけどうでもいいし
イミュータブルがどうとかもかなりどうでもいい(パフォーマンス問題が出ない限りは)
今の場合
「(aaa)という理由により、文字列をイミュータブルにすると
(bbb)という利点がプログラマーにあり
(ccc)という利点がユーザーにあります」
の
aaa と bbb と ccc 埋めてねってくらい
俺的にはxxxであるべきとかどうでもいいんですよ、そんなん主観的な感情論
言い方が悪かったのかもしれんが
「イミュータブルであると、なぜ、誰にとって、どううれしいのか」
を説明してくれって言ってるわけだが
シンタックスシュガーとかぶっちゃけどうでもいいし
イミュータブルがどうとかもかなりどうでもいい(パフォーマンス問題が出ない限りは)
今の場合
「(aaa)という理由により、文字列をイミュータブルにすると
(bbb)という利点がプログラマーにあり
(ccc)という利点がユーザーにあります」
の
aaa と bbb と ccc 埋めてねってくらい
俺的にはxxxであるべきとかどうでもいいんですよ、そんなん主観的な感情論
492デフォルトの名無しさん
2017/10/12(木) 02:59:54.14ID:0FMeS+81 >>485
そうしないようにfrozenで最適化したんでしょ。
そうしないようにfrozenで最適化したんでしょ。
493デフォルトの名無しさん
2017/10/12(木) 03:10:54.78ID:bkFDlrr0 んー、興味の対象が違うのかなぁ
ちょっぱやで書かしてくれる言語って意味でRuby使ってるようなところはあるので
ちょっぱやで書かしてくれる言語って意味でRuby使ってるようなところはあるので
494デフォルトの名無しさん
2017/10/12(木) 03:19:31.70ID:D7OLf+6g >ちょっぱやで書かしてくれる言語
>って意味でRuby使ってる
そうそう
Rubyは典型的なLLだからね
全部関数型で書きたければ
最初から関数型言語使うでしょ
>って意味でRuby使ってる
そうそう
Rubyは典型的なLLだからね
全部関数型で書きたければ
最初から関数型言語使うでしょ
495デフォルトの名無しさん
2017/10/12(木) 03:49:53.06ID:BE/Y4M/4 「Effective Ruby」の項目47 に書いてある。
ループ内のオブジェクト・リテラルを避けよう
ループの度に、オブジェクトが作られて、すぐにガベージになるから無駄。
オブジェクトをループの外に出すか、freeze するか
ARY = %w(a b c).map(&:freeze).freeze
p ARY #=> ["a", "b", "c"]
各要素をfreeze して、配列もfreeze する
Ruby 2.1 以降は、
"a".freeze
これで定数になる
ループ内のオブジェクト・リテラルを避けよう
ループの度に、オブジェクトが作られて、すぐにガベージになるから無駄。
オブジェクトをループの外に出すか、freeze するか
ARY = %w(a b c).map(&:freeze).freeze
p ARY #=> ["a", "b", "c"]
各要素をfreeze して、配列もfreeze する
Ruby 2.1 以降は、
"a".freeze
これで定数になる
496デフォルトの名無しさん
2017/10/12(木) 04:31:19.61ID:0FMeS+81 frozen_string_literal: true
497デフォルトの名無しさん
2017/10/12(木) 05:21:18.77ID:K4F4DzE/ 破壊的なのは全部!付きにしてくれたらよかったのに
498デフォルトの名無しさん
2017/10/12(木) 14:22:49.20ID:UWf9SeC0499デフォルトの名無しさん
2017/10/12(木) 14:23:59.29ID:UWf9SeC0500デフォルトの名無しさん
2017/10/12(木) 18:30:04.66ID:xdbkqR2O それはそれで冗長じゃねってオモ
501デフォルトの名無しさん
2017/10/12(木) 19:50:30.80ID:TdwSq1rR >>435 のスライドによるとruby4では
不変リテラル配列を @[1, 2, 3] で作れたり、
不変リテラルハッシュを @{ 'a' => 1, 'b' => 2 } で作れたり
出来るかもしれない
リテラル文字列も一律freezeなんてしないで @"string" っていう構文にすりゃよかったのに
不変リテラル配列を @[1, 2, 3] で作れたり、
不変リテラルハッシュを @{ 'a' => 1, 'b' => 2 } で作れたり
出来るかもしれない
リテラル文字列も一律freezeなんてしないで @"string" っていう構文にすりゃよかったのに
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【次の一手】台湾問題で小林よしのり氏が私見「まさに戦争前夜」「ただちに徴兵制を敷いて、高市支持者を最前線へ」… ★5 [BFU★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 「韓国人の高市早苗評」、限界突破。 [592058334]
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- 1,000万円のBMWに擦ってしまった札幌のガキ、捕らえられてガチで詰む [329329848]
- >>3と>>5のワードを使ってai生成する
- ガバガバなんだよ
