Ruby 初心者スレッド Part 61 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/08/25(金) 15:59:11.22ID:HsL9LVKJ
プログラミング言語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/
2017/09/05(火) 22:33:24.08ID:MbNhWD1A
MFC、ATLと続き、Cランタイムまでロードして色々試してまわったけど
構造体を値渡しする関数は自分で作らないとないっぽい
どれもこれもポインターをわたしとった
スマートポインターやインターフェイス、クラスやインスタンス、メンバーやメソッドの扱いなんかも、
DLではちょっと無理そう
こういうのは横着せずラッパー書いてやるしかないと思う
2017/09/05(火) 22:58:31.06ID:fnT2eJZH
あほくさ。C#使やいいのに。100倍楽だわ
126デフォルトの名無しさん
垢版 |
2017/09/06(水) 00:41:36.28ID:eoNcIyiq
な〜にキレてんだよ
不都合なレスでもでもあったのか?
2017/09/06(水) 01:26:41.12ID:iI8edc8I
>構造体を値渡しする
構造体みたいなサイズが大きいものは、普通、値渡し(コピー)しない

ポインタで渡すとコピーされないから、普通は、ポインタ(参照)渡し
128デフォルトの名無しさん
垢版 |
2017/09/06(水) 02:14:32.33ID:eoNcIyiq
age
2017/09/06(水) 10:37:36.24ID:J8xaYq/0
>>124
探したったぞ。
WindowFromPoint()

凝ったことをやりたいならffiモジュールを調べてみろ。
すくなくともコールバック関数は使える。
2017/09/06(水) 10:38:56.74ID:ygscOEFy
言っちゃなんだけどバグの元だな
2017/09/06(水) 10:40:20.14ID:J8xaYq/0
>>127
構造体が充分小さい場合は値渡しでいい場合もある。
C#でも、そのためにstructがある。
2017/09/06(水) 17:23:37.45ID:0rliz1cq
dlでcallack使えるとかはもう出ていて、
今問題になってるのはdlでも構造体の値渡しができるかどうか

>>129
結果、下記ので呼べたけどこれじゃダメなの?

module MODU

関数ロード部分
extern "int WindowFromPoint(int,int)"

end

p MODU.windowFromPoint(x,y)
2017/09/06(水) 18:39:39.83ID:xWkzKu3e
みんなffi使ってるからもうその話いいよ
134デフォルトの名無しさん
垢版 |
2017/09/06(水) 19:08:12.67ID:2frueYn2
ん?
荒らしが嫌がるという事は有益なレスなのか

いいぞ、もっとやれ
2017/09/06(水) 19:36:05.78ID:vILuBDeW
>>132
たしかに素直な構造体ならいけそうだ。

場合によってはアラインメントとかパディングとかでひっかかりそうだが、回避しきる自信があるのなら、もうそれでもいんじゃね?
オレならさっさと逃げるけどな。
136デフォルトの名無しさん
垢版 |
2017/09/06(水) 20:19:48.12ID:2frueYn2
単にリファレンスを読んでないだけじゃないのかそれ?
2017/09/06(水) 23:23:31.25ID:ygscOEFy
↑ユーザー層が良く表れててサイコー
2017/09/07(木) 03:19:34.26ID:ItXgki7C
133 名前:デフォルトの名無しさん 2017/09/06(水) 18:39:39.83 ID:xWkzKu3e
みんなffi使ってるからもうその話いいよ
134 名前:デフォルトの名無しさん 2017/09/06(水) 19:08:12.67 ID:2frueYn2
ん?
荒らしが嫌がるという事は有益なレスなのか

いいぞ、もっとやれ
135 名前:デフォルトの名無しさん 2017/09/06(水) 19:36:05.78 ID:vILuBDeW
>>132
たしかに素直な構造体ならいけそうだ。

場合によってはアラインメントとかパディングとかでひっかかりそうだが、回避しきる自信があるのなら、もうそれでもいんじゃね?
オレならさっさと逃げるけどな。
136 名前:デフォルトの名無しさん 2017/09/06(水) 20:19:48.12 ID:2frueYn2
単にリファレンスを読んでないだけじゃないのかそれ?
137 名前:デフォルトの名無しさん 2017/09/06(水) 23:23:31.25 ID:ygscOEFy
↑ユーザー層が良く表れててサイコー
139デフォルトの名無しさん
垢版 |
2017/09/07(木) 23:57:00.12ID:04reamdt
別々のgemなのにrequireする時の名前がかぶってしまって、しかも両方を呼び出す必要がある場合、
どうやってrequireするのが正しいの?

例で、OpenGLのgemがいくつかあるけど、そのうちの二つが"opengl"でrequireする事になっている
2017/09/08(金) 01:34:25.09ID:3vC4jpKo
問題ないです
名前が衝突することは良くありますが
Rubyはダックタイピングを基調としているので
名前(メソッド名)が同じなら同じような振る舞いをします
たとえ出所が違っていても名前が同じなら同じような振る舞いをします
これがダックタイピングであり
そのようなことはRubyが言語側で保証しているので
プログラマが心配することは有りません
2017/09/08(金) 01:39:16.03ID:NantPsUO
質問:どうやって〜するのか?
回答:問題ない

2017/09/08(金) 03:04:34.55ID:K2jDcQfO
・・・/上のディレクトリ/opengl
となっているのを
・・・/上のディレクトリ/exampl1/opengl
・・・/上のディレクトリ/exampl2/opengl
のように手作業で新しいディレクトリつくってそこに移動させる

で、
require "exampl1/opengl"
require "exampl2/opengl"
みたいな感じで呼び出す、とか
2017/09/08(金) 03:19:41.86ID:mcCYyLIS
ん、同じrbファイル内でrequireするの?
モジュール名も同じなら1つのモジュールの中に両方入ることになる気がするけど
2017/09/08(金) 05:59:14.78ID:/QLRsA7o
通常、Load-Pathで最初に見つかったファイルひとつをrequireする
requireはファイルパスつきで指定もできるので、区別できる程度のパスつきで指定すると実質複数読み込める
んでRubyはオープンクラスなのでAA#bbの定義が2回目のrequireで発見されたら2回目ので上書きされる

で、gemに限っては gem 'gemリポジトリ名' で指定して読み込むことができる(これは登録上被らないので)
一般的にはLoad-Path依存という回答
2017/09/08(金) 15:38:22.30ID:K2jDcQfO
モジュール内だけとかにファイルを読み込めれば名前空間的な扱いができそう

requireやloadじゃなく、第三の読み込み方法が必要になるけど
2017/09/08(金) 18:13:46.58ID:mcCYyLIS
異なるgemだけどトップレベルのモジュール名が同じものを
一つのrbファイルの中で扱う場合の対処方法として一般的に認知されてるものは無いっぽいね
(別のrbファイル内ならgemコマンドとrequireかな)

loadの第二引数でtrueを渡してAnonymousにしたモジュールに別名を付けるような仕組みがあればいいみたいだけど
loadはAnonymousモジュールを返してくれないから少しtrickyなことをしないと無理

ダサいけどdupして別名で使うのが簡単な気がする
あとはforkしてrenameとかかな

#load_foo.rb
require ‘foo'
Bar = Foo.dup
Object.send(:remove_const, :Foo)

#main.rb
require ‘load_foo’
Bar.something
2017/09/08(金) 20:25:09.24ID:dCkrwQvc
でも、違うクラスのほうを見にいって、うまく動作しないはめになりそうだけどな。
2017/09/08(金) 21:38:34.51ID:K2jDcQfO
適当なモジュールを定義して、
そのモジュールに対してmodule_evalでファイルを評価させるとかどう?

ファイル側はトップレベルでのloadを想定してるだろうから、何らかから派生させたモジュールを用意する必要があると思うけど
kernelだったかmainだったか

で、同名のファイルも別のモジュールでeval
149デフォルトの名無しさん
垢版 |
2017/09/09(土) 08:22:23.23ID:A2Lkc5St
ヤフー株式会社が中途採用していたので応募した。
会社半休とって、深夜01時までかけて、写真付き履歴書、職務経歴書(必須提出書類)つくった。

火曜に提出、金曜に不採用通知が来た。

ショック!でもまあ、さすが爆速開発の会社。
まあ、しょうがない。
150デフォルトの名無しさん
垢版 |
2017/09/10(日) 21:05:31.91ID:16Gqj/Qh
RubyはマルチパラダイムなLLって言われるけど、
ほんとどんな書き方でも可能だよな

逆に、他の言語で可能だけどRubyじゃできない書き方って何かあるの?
151デフォルトの名無しさん
垢版 |
2017/09/10(日) 21:08:03.14ID:n6o1Bnrv
n++
2017/09/10(日) 21:29:31.42ID:E1NtPZfm
パターンマッチ
参照渡し
Null非許容参照型
2017/09/10(日) 21:31:59.45ID:CfAD8p5O
>>150
少し前にあるけど
同じ名前の2つの異なるモジュールを
それぞれ別名でロードして使うことが簡単に出来ないみたい
2017/09/10(日) 22:01:26.40ID:/lqG1P6W
>>150
インテリセンスのような、洗練されたIDEサポート。
2017/09/10(日) 22:08:47.22ID:pWB+7BVh
>>150
なので、他人の読むほうからしたら悪夢のような言語
156デフォルトの名無しさん
垢版 |
2017/09/11(月) 03:20:30.57ID:jNI6u+LE
こりゃあ自演やってますわ

晒しage
2017/09/11(月) 03:47:13.89ID:uZhmkQHT
嘘をつかないとネガキャンもできないとか、
どんだけこの言語は強力なんだよ


それ程rubyが怖いの?
2017/09/11(月) 04:39:33.36ID:0SM4UhfV
こんなやつらばっかりじゃそりゃpythonに負けるわけだw
2017/09/11(月) 05:07:13.86ID:VvF2iP9D
>>150
Lispのマクロ
Prologのユニフィケーション
2017/09/11(月) 05:26:08.54ID:uZhmkQHT
python騙るなボケ
このpythonの恥さらしが
勝利宣言なんか負けですと言ってる様なもんだろ
2017/09/11(月) 05:49:53.28ID:qwui3b48
書き方を聞いたんだけど、なんで答えてるレスはどれも同じ様な勘違いしてるの?
もしかして自演するほどRubyが怖い?
2017/09/11(月) 06:11:35.71ID:6TazFtUw
使えない言語ならそもそもアンチなんて湧かないし
使える言語だからこそ怖いんだよ
163159
垢版 |
2017/09/11(月) 06:50:21.08ID:VvF2iP9D
>>150
>>159
>>161
Prologのパラダイムは論理型でそれを
Rubyは標準でサポートしてないから
「マルチパラダイム〜」の反証になってる
2017/09/11(月) 07:01:29.60ID:6TazFtUw
嘘を付いてまでネガキャンしてる人がいるから言語の話は無理だと思うよ
もうちょっと荒れていない時を見計らったら?
それに、それ、異論がばんばん出そうだし
165デフォルトの名無しさん
垢版 |
2017/09/11(月) 09:25:49.87ID:9tUjHIzk
クラスはClassクラスのインスタンスだってのがよく判らん。
Fixnum, String, ArrayもClassクラスのインスタンスだって事らしい。

こんな仕様が一体、何の役に立つんだ?
166デフォルトの名無しさん
垢版 |
2017/09/11(月) 09:28:34.16ID:9tUjHIzk
インスタンスなのだから、クラスのメソッドをもちろん呼べる。スーパークラスのメソッドも呼べる。

それから、Classクラスのメソッドも呼べる。こういう仕様にしたかったという事なのだろうか?
167デフォルトの名無しさん
垢版 |
2017/09/11(月) 09:43:53.15ID:9tUjHIzk
Classクラスにインスタンス変数を定義すれば、すべてのクラスのクラス変数(Static変数みたいなもん)となる。

class Class
attr_accessor :foo
end
class Foo;end
Foo.foo = 10
puts Foo.foo # => 10

どうやら、こういう事が出来る様になるらしい。
2017/09/11(月) 09:50:42.79ID:R+JnAI3g
どのサイト見てそういう話になっていっているのか少し気になる
Webサイトは焚書できないからな
169デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:03:46.95ID:9tUjHIzk
BasciObject, Objectがクラスで
Kernel, Moduleがモジュールだ。

ClassはModuleを継承したクラスだ。Classにあるメソッドは、new, superclassだ。全てのクラスはClassのインスタンスなので、

Foo.new, String.new, Foo.superclass, String.superclassといったクラスメソッドを呼び出す事ができる。

ModuleにはRubyのリフレクション機能を実現するメソッドやeval族がある。
例:nacestors, instance_method, method_defined?
例:class_eval, instance….おっと、instance_evalはBasicObjectにある。


うぅーん。独特な世界観だ。
170デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:05:04.24ID:9tUjHIzk
>>168
みてるのは、『メタプログラミングRuby」第一版。
171デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:08:48.21ID:9tUjHIzk
あと見ているのは、Ruby 2.0.0 Reference Manual。macOS SierraにはRuby2.0が最初から入っているから、ちょいと古いRubyを使ってる。

Ruby2.2あたりでGCの改良があって、その関係でSecurity重視のWebアプリ作る場合は、2.0はNGらしい。

誤解してる?
2017/09/11(月) 10:10:47.61ID:OodeiMD8
そういう問題じゃなくて、Webアプリ作るなら実行環境と開発環境をなるべく同じにするのは当たり前。
特にRubyみたいに互換性のいい加減なものを使うなら尚更のこと。
173デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:15:39.57ID:hxvjUFQQ
webサーバやDSLの主流言語の一つって時点で他の主要言語を繋げて扱える上に手軽だから
使える人が増える事はあっても、減ることは無い
そしてRuby恐怖症患者が恐れているのはこの部分だと思う
174デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:17:31.55ID:9tUjHIzk
俺的ざっくりRubyのバージョンによる違い。

1. 2.0 - 2.1は1.9.3のbugfix版
2. 2.2 - 2.4はGC改良されてるが、言語仕様的には1.9.3と大差無い。

Fixnum, BignumがIntegerに統合された(2.4)とか、String Literalがdefaultでfrozenされている(2.3)とか、細かな仕様変更があるが、俺への影響は無いな。
175デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:21:25.75ID:9tUjHIzk
俺:昔Ruby1.8 - 1.9.2の頃、WebスクレイピングをRubyでやってた。Mechanizeとか便利だぁ。。。とか言いながら。その頃DSLなんてあまり気にしなかった。

しばらくXcodeばかりいじって居て、Rubyに戻ってきたら2.4になってた。SinatraとかRailsとか触ってみたら、DSLバリバリで、これはまずいと感じて、「メタプログラミング」の本読んでます。
176デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:23:03.39ID:9tUjHIzk
Rubyの歴史については、en.wikipediaのRuby(programing language)のpageがよく纏まっている。
177デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:29:24.77ID:9tUjHIzk
今後、Ruby2.5, Ruby3.0が予定されているが、3.0の仕様は流動的みたいだ。

1. 並列処理
2. 静的型付け

1は技術的に難しそうだし、2はコミュニティに受け入れられるのか?
2017/09/11(月) 10:30:38.59ID:R+JnAI3g
反省している
2017/09/11(月) 10:31:18.51ID:AukiEDF0
>>178
はい
2017/09/11(月) 10:36:20.19ID:ggzNTq4z
>>165
クラス自体を処理の対象にできる。
.NETでも、Typeクラスがあったりする。
C++などではできないこと。
181デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:42:25.66ID:9tUjHIzk
>>180
クラス自体を処理の対象にする場面って?
一つ見つけたけど、他にある?

見つけた一つ!
1. クラスメソッドを提議
2017/09/11(月) 10:43:38.99ID:OodeiMD8
>>180
それは違う
Rubyのクラスはそれ自体が本当にオブジェクトだけど、
.NETのTypeオブジェクトやJavaのClassオブジェクトはリフレクションのためのハンドルに過ぎず、オブジェクトとは明確に異なる
183デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:48:45.33ID:9tUjHIzk
クラス自体を処理の対象にする、ってのは例えばStringクラスのsizeメソッドの仕様が気に食わん。

だったら、俺が好きな仕様に変えてやる!(モンキーパッチング)

って事ができるのは、StringクラスがClassクラスのインスタンスだから出来るってことなのかも。
184デフォルトの名無しさん
垢版 |
2017/09/11(月) 10:56:59.59ID:9tUjHIzk
クラス拡張、オブジェクト拡張は
class << self; end
class << obj; end
って感じで行うが、extendメソッドを使ってもできる。
こいつがクラス拡張、オブジェクト拡張のショートカットみたいだ。

class MyClass
extend MyModule
end
こんな感じ。

class MyClass
class << self
include MyModule
end
end
こんな事しなくても良くなる。
185デフォルトの名無しさん
垢版 |
2017/09/11(月) 11:14:01.54ID:9tUjHIzk
俺の備忘録、スレ汚しスマソ

aliasを使うとメソッドの再定義ができる。
String#lengthメソッドを再定義して、再定義前の実装をreal_lengthで呼び出せる様に退避させる様にする例。
class String
alias :real_length :length
def length
# anaother implementation
end
end
186デフォルトの名無しさん
垢版 |
2017/09/11(月) 11:21:39.37ID:9tUjHIzk
aliasを使うと同じ実装を2つの名前で、可視性private/publicをコントロールしながら呼び出したりできる。

class C
def x; “OK”; end
alias :y :x
private :x
end

obj = C.new
obj.y # => “OK”
obj.x # => private methodだから呼べまシェーン。
2017/09/11(月) 12:03:38.85ID:ggzNTq4z
>>182
違わない。用途を限定しすぎ。
型を引数にできたり、型のリストが作れたり、型自体の基底クラスが存在するから可能になることがいくつもある。
2017/09/11(月) 14:19:18.95ID:VvF2iP9D
>>165
>クラスはClassクラスのインスタンス
>こんな仕様が一体、何の役に立つんだ?
メタプログラミング
189デフォルトの名無しさん
垢版 |
2017/09/11(月) 15:26:04.86ID:4atU11H8
うわ、まだこんな言語やってるやついたんだ
endとかきめえ
2017/09/11(月) 15:46:37.43ID:y9RYm9ja
自分が使ってない言語の出来なんかどうでもいいだろ
関係ないんだよ、君には
191デフォルトの名無しさん
垢版 |
2017/09/11(月) 15:51:37.08ID:9tUjHIzk
中かっこで、一行で治るblockを記述し、
do end, class endで複数行に渡るblockを記述する。

class endもblockらしい。
例:
class Foo
puts ‘OK’ # => OK、なんと実行されちゃう!
end
192デフォルトの名無しさん
垢版 |
2017/09/11(月) 15:53:04.47ID:9tUjHIzk
class Bar
attr_accessor :a
end

これもModule#attr_accessorメソッドの呼び出し(引数:a)だって。
193デフォルトの名無しさん
垢版 |
2017/09/11(月) 15:53:50.74ID:9tUjHIzk
putsはKernel#putsで定義されている。
194デフォルトの名無しさん
垢版 |
2017/09/11(月) 15:55:48.32ID:9tUjHIzk
putsってグローバル関数だと思ってた。Rubyにはグローバル関数ってのは無いのか?

たしか、$fooでグローバル変数だよねぇ。
195デフォルトの名無しさん
垢版 |
2017/09/11(月) 16:15:12.72ID:I3u+9T/v
ID:9tUjHIzkこそRubyを使うのに相応しい人材だ
Rubyはこうでなくてはダメだ
196デフォルトの名無しさん
垢版 |
2017/09/11(月) 16:24:37.91ID:9tUjHIzk
試しにやってみた。
class Bar
#attr_accessor :a
attr_accessor “a”
end

puts (Bar.new).a = 3 # => 3

なんと、attr_accessorの引数はputsと同じ様に文字列でもOK!
調子に乗って、
puts :OK
puts :Failed NG # error
puts :”Failed NG”

うぅーん。Symbolと文字リテラルは違うはず。
2017/09/11(月) 17:27:22.55ID:ggzNTq4z
>>196
カンマ
2017/09/11(月) 17:28:46.19ID:VvF2iP9D
>>194
>グローバル関数ってのは無いのか?
ない

ただトップレベルのメソッドを
実質的にグローバル関数として利用するのは可能
2017/09/11(月) 18:25:05.46ID:VnfANrEr
ネガキャンはとうとう嘘まで付いちゃったか
2017/09/11(月) 19:01:04.46ID:dKd+OEyf
ruby 2.1
WEBrick 1.3.1

Internal Server Error
(erb):58: syntax error, unexpected end-of-input, expecting keyword_end ; _erbout.force_encoding(__ENCODING__) ^
文法エラー、予期せぬend-of-input、keyword_endを待つ;

_erbout.force_encoding(__ENCODING__) ^
って何でしょうか?
2017/09/11(月) 19:35:28.63ID:503iQjsy
文法エラーだろ。
まずそれを修正すれば。
202デフォルトの名無しさん
垢版 |
2017/09/11(月) 20:12:04.40ID:Se8bNuoM
>>200
erbがエラー吐いてんじゃね?
template engineだから、*.html.erbに問題あるんちゃうか?
203デフォルトの名無しさん
垢版 |
2017/09/11(月) 20:31:42.69ID:8y57wnUU
>>163
確かに「Rubyはマルチパラダイム言語である」の明確な反証になっているね

ところで、Python の公式文書には以下の記述がある:
  https://docs.python.jp/3/howto/functional.html
  >> 複数のアプローチに対応した言語もあり、
  >> Lisp, C++, Python はそうしたマルチパラダイム言語です

故に、少なくとも Python は標準で論理型をサポートしていないから、
>>163 の主張は「Python はマルチパラダイム言語である」の反証でもある訳だ

たかだか2chの通りすがりのカキコ(>>150)どころか、
Python様の公式文書にすら堂々と反証してしまう >>163 ってスゲーよなあ(棒
2017/09/11(月) 20:38:54.64ID:I3u+9T/v
>>203
君もRubyとRubyコミュニティーに向いてる人材だな
2017/09/11(月) 20:43:18.49ID:wRb7h9Km
>>200
endを期待してるところでendが無いよってエラーだよ

_erbout.force_encoding(__ENCODING__) は
ERB#set_eoutvar内で呼ばれてる処理だけど
今の理解状況なら気にする必要ない
206デフォルトの名無しさん
垢版 |
2017/09/11(月) 20:47:01.81ID:8y57wnUU
>>174
自作のRubyで書いたドキュメンテーションツールを日常的に使っているけど、
1.9 で28秒だったのが(ほんの気まぐれで) 2.4 へ変えただけで6秒になった
レスポンスが4倍から5倍変わるのは大きなインパクトだった

付け加えると、こうしてバージュンアップを繰り返してもなお
後方互換性を維持し続けてくれているのはありがたい
(もちろん自作ツールでメタプログラミングといった魔術は使っていないが)
2017/09/11(月) 20:50:22.49ID:pNAVrMoT
>後方互換性を維持し続けてくれているのはありがたい
ナイスジョーク👍
208200
垢版 |
2017/09/11(月) 20:55:04.19ID:dKd+OEyf
>>201-202 >>205
助言くださった皆様、どうもありがとうございます。
とりあえずendを閉じ忘れていないかチェックしてみます。
209デフォルトの名無しさん
垢版 |
2017/09/11(月) 21:28:47.33ID:8y57wnUU
>>207
>ナイスジョーク👍

確かに世の中にはバージョンアップしただけで、たかだか
Hello world すら動かなくなるナイスジョーク👍な言語も存在する(棒

Rubyの設計上の欠点とは何か?
http://mevius.2ch.net/test/read.cgi/tech/1413113999/126
210デフォルトの名無しさん
垢版 |
2017/09/11(月) 22:10:48.79ID:8y57wnUU
>>150
>逆に、他の言語で可能だけどRubyじゃできない書き方って何かあるの?

Ruby と競合するLLで、かつ関数型というパラダイムに限定すれば、
「関数は一級市民ではない」という制限がある
これは Ruby の世界だと「メソッドがオブジェクトではない」と
言い換えることができる

具体的なコードを Python で示そう:
(注:以下は Python を例にしているが、JavaScriptでも同様なコードは書ける)
  >>> def add(x, y): return x + y  # 関数 add を定義
  ... ^D
  >>> add(1, 2)  # 関数へ実引数 (1, 2) を適用
  3
  >>> f = add  # 関数は値(=一級市民)だから、それを別の変数 f として宣言
  >>> f(1, 2)  # 変数 f へ実引数 (1, 2) を適用しても add と同じ結果になる
  3

それに対して Ruby では:
  irb(main):001:0> def add(x, y); x + y; end  # メソッド add を定義
  => :add
  irb(main):002:0> f = add # メソッドは値(=一級市民)ではないから..(略
  ArgumentError: wrong number of arguments (given 0, expected 2)
     from (irb):1:in `add'
  from (irb):2
  from /opt/local/bin/irb:11:in `<main>'
2017/09/11(月) 22:53:57.56ID:/+/7clo/
ブロックがオブジェクトじゃないのはほんと糞
Rubyは基本的に嫌いじゃないけどこれだけは擁護できないわ
2017/09/11(月) 23:30:33.81ID:503iQjsy
いや、ふつう。
必要であればlambdaにすればよし。
2017/09/11(月) 23:51:41.69ID:dZxzu+uY
>>210
f = method :add
p f[1,2] # => 3
214163
垢版 |
2017/09/12(火) 00:16:04.48ID:EWvqPynr
>>203
「マルチパラダイム」への反証じゃなくて
「どんな書き方でも可能」への反証
「他の言語で可能だけどRubyじゃできない書き方」の例証でもある
2017/09/12(火) 00:26:02.80ID:FDETfUWp
メソッド呼び出し時の括弧をオプショナルにしてるから
f = add みたいなのは出来ないよね
でもそういう使い方をするときはメソッドじゃなくProcオブジェクト使う
だからObject#methodを実際のコードで使ったことはない
2017/09/12(火) 00:37:53.72ID:JOxdLua/
俺が質問したのは書き方
Rubyは純オブジェクト指向で書けるし、関数言語的な書き方も可能、ワンライナーやダックタイピング、メタプログラミングも書ける
だから逆に他の言語で実用的な書き方を挙げてほしかったんだけど
217デフォルトの名無しさん
垢版 |
2017/09/12(火) 01:09:50.45ID:HQWpPXKt
n++
218デフォルトの名無しさん
垢版 |
2017/09/12(火) 01:10:31.53ID:HQWpPXKt
rubyの連中は、初心者、日本人をバカにするからきらいだ
219デフォルトの名無しさん
垢版 |
2017/09/12(火) 01:11:34.30ID:HQWpPXKt
マルチパラダイムの言語をしらべればいいだろ
D, pike, いろいろある
2017/09/12(火) 01:12:37.06ID:K8M+GTE7
>>215
何でそんな言い訳がましい書き方すんの?
defで宣言した関数は変数に代入出来ない。そのような場合はProcを使う必要がある。この行き当たりばったりな仕様は関数を第一級オブジェクトとして扱える言語が流行ってきたため「る、rubyでもできるし!」と言いたいがために適当に実装したためである、ってスパっと言えよ。
2017/09/12(火) 01:15:08.18ID:EWvqPynr
>>216
それは「書き方」の定義が曖昧だから

でもまあもう少し小さな区分で言うと
動的型付けの関係でJavaができるような
メソッドのオーバーロードは標準のRubyではできない
2017/09/12(火) 01:19:06.28ID:TH/zNQOA
思い込みで嘘振りまいてたアンチが発狂しとる
2017/09/12(火) 02:14:24.98ID:FDETfUWp
>>220
嘘で印象操作はいかんよ
そのうちRubyも韓国起源説を唱えそうだな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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