2017-08-12 17 views
2

私はRubyを初めて使っています。Rubyモジュール、ライブラリが必要

私が必要とする回線は基本的にあることを理解
#!/usr/bin/env ruby 
require 'rubyfunction1' 
require 'rubyfunction2' 

(それは、単純な基本的な用語に入れて)、他のスクリプトを呼び出す:私はRubyスクリプトを見ると、それは通常、このような行が含まれている、ことを理解しています。それは本当にそこにあるすべてです。これらの他のスクリプトは関数です。

ここで、rubyfunction1スクリプトとrubyfunction2スクリプトの内容を2つの異なる変数に入れてみましょう。変数の内容を要求するにはどうすればよいですか?

それとも、私はこのような何かを行うことができるようにしたいとします

require '`/home/swenson/rubyfunction1.rb`' 

私は、これは宝石/ルビー機能を必要とするの回り道であることを理解、それがである場合、私は知って興味すべてこのように可能です。

基本的には、コマンドラインで/home/swenson/rubyfunction1.rbスクリプトを単独で実行すると、基本的にスクリプトの内容が出力されます。それは"cat /home/swenson/rubyfunction1.rb"と同じことになります。

require '`/home/swenson/rubyfunction1.rb`' 
require '`/home/swenson/rubyfunction2.rb`' 

または

specvar1 = `/home/swenson/rubyfunction1.rb` 
specvar2 = `/home/swenson/rubyfunction2.rb` 
require specvar1 
require specvar2 

これが可能である:

私はこのような何かを行うことができるようにしたいですか?私はそれを動作させるために適用することができますどのような提案?

UPDATE:

は、だからここに私がやってしまったものです。

example.rbと呼ばれるメインスクリプト:add.rbの

#!/usr/bin/env ruby 

add = `./add.rb`  # for my purposes, this will serve as require 
subtract = `./subtract.rb` # for my purposes, this will serve as require 

eval add 
puts "I can add: #{add(3, 2)}" 

eval subtract 
puts "I can now subtract #{subtract(3, 2)}" 

内容:subtract.rbの

#!/usr/bin/env ruby 
puts <<-function 
#!/usr/bin/env ruby 
def add(a, b) 
    a + b 
end 
function 

内容:

#!/usr/bin/env ruby 
puts <<-function 
#!/usr/bin/env ruby 
def subtract(a, b) 
    a - b 
end 
function 

コマンドラインから実行、エラーは発生しません。

# ./example.rb 
I can add: 5 
I can now subtract 1 

基本的に、私がしたいことは正確にこれです。しかし、私はおそらくこれを行うための最適な方法があることを知っています(直接相対ファイルを必要とせずに)。ですから、私がこれを更新または最適化するのを助けてください。

+0

あなたは他の言語についてのあなたの理解に基づいてこれらのすばらしい質問をしていますか?はいの場合は、その言語に言及すると、私たちはあなたの視点と将来の訪問者からも見えるようになります。 :) Rubyコミュニティへようこそ。 – illusionist

+1

はい、ヘビーシェルプログラミングの背景から来ています。私の上司は、私の創造性をより現代的な言語でよりよく使うことができると感じています。ルビー、パイソン。私はそれに引き寄せられたので、私はルビーを選んだ。私は約1〜2ヵ月で習得できる言語のように見えます。 – swenson

答えて

0

だから、私は、我々は3つのファイル

add.rb

#!/usr/bin/env ruby 

def add(a, b) 
    a + b 
end 

減算を持っているとしましょう、私が正しくあなたの質問を理解すると思います。RB

#!/usr/bin/env ruby 

puts "def subtract(a, b)" 
puts " a - b" 
puts "end" 

example.rb

require './add.rb' 
subtract = `./subtract.rb` 

puts "I can add: #{add(3, 2)}" 

# can't do `subtract`, yet, as we haven't `eval`ed the code even though we've run executed the file 

eval subtract 

puts "I can now subtract #{subtract(3, 2)}" 

、コマンドライン上でruby example.rbを実行しているの出力は、次のとおりです。

$ ruby example.rb 
I can add: 5 
I can now subtract 1 

ので、add.rbがちょうど定義します機能add。そのファイルrequireをロードすると、問題なくコード内でその関数を使用できるようになります。

しかし、はそう、コマンドライン上でそれを実行すると同じように見えますが、それだけでいくつかのコードを出力...関数を定義していないsubtract.rb:私たちの3番目のファイルには、だから今

$ ./subtract.rb 
def subtract(a, b) 
    a - b 
end 

example.rbは、我々はadd.rbrequireし、我々はあるとして、我々のコードでaddを使用して起動することができますが、その後、我々はsubtract.rbを実行したい(バック使用して、ここティック)との出力をキャプチャそれ。この時点では、subtractの2つの数値は出力できませんでした。次にevalを使用してsubtractメソッドの出力を評価します。このメソッドは私たちのためにメソッドを定義します。subtractは問題なく2つの数値になります。

evalは、任意のコードを実行できるので、一般的に嫌われています。 evalあなたがそれを飼いならす方法を知らない限り、信頼できないコード。この場合、@JörgWMittagがコメントに指摘しているように、このコードは信頼されるべきです。そうでなければ、信頼できないファイルを実行してこのコードを取得しました。ただし、信頼できないユーザーの入力には注意してください。

+1

'<< - 'や 'rescue'のような複雑な構文を使って' require'のようなメソッドのシンプレックスを説明するのは賢明ではありません。それは質問者を混乱させるかもしれません。説明を簡略化することは可能ですか? – illusionist

+1

"' eval'は、任意のコードを実行することができるため、一般的に嫌われています。 - この場合は、既に実行したファイルの出力を評価しているので、ファイルが信頼されているか、あるいは、すでに信頼できないコードが実行されています。 –

+0

両方に良い点がありますが、私はその例を単純化します。あなたはすでにファイルを実行しています。この場合、コードは信頼されています。これは、「ユーザーからの「eval」文字列を単に開始しないでください」@JörgWMittag –

1

私は、必要な行は基本的に(基本的な単純な言い方をすると)、他のスクリプトを呼び出すことを理解しています。それは本当にそこにあるすべてです。

はい。 loadrequire、およびrequire_relativeは単にRubyファイルを実行します。それでおしまい。

これらの他のスクリプトは機能です。

いいえ。スクリプトです。 Rubyには関数のようなものはありません。

ここで、rubyfunction1スクリプトとrubyfunction2スクリプトの内容を2つの異なる変数に入れてみましょう。変数の内容を要求するにはどうすればよいですか?

できません。 requireはファイルを実行します。これは、ファイルの名前(より正確には、相対パス)を引数として取ります。 Rubyコードはファイルの名前ではありません。

それとも、私はこのような何かを行うことができるようにしたいとします

require '`/home/swenson/rubyfunction1.rb`' 

私は、これは宝石/ルビー機能を必要とするの回り道であることを理解、それがであるかどうかを知るためにイム好奇心すべてこのように可能です。

これも可能です。これについて特別なことは何もありません。単にパス`/home/swenson/rubyfunction1.rb`でファイルを実行します。それはやや珍しい道ですが、特別なことは何もありません。それは他のどのような道でもあり、そこに面白いキャラクターがあります。

ので、私はこのような何か行うことができるようにしたい、やろうと何イム反復する:

require '`/home/swenson/rubyfunction1.rb`' 
require '`/home/swenson/rubyfunction2.rb`' 

または

specvar1 = `/home/swenson/rubyfunction1.rb` 
specvar2 = `/home/swenson/rubyfunction2.rb` 
require specvar1 
require specvar2 

これは可能ですか?私はそれを動作させるために適用することができますどのような提案?

あなたがここで何をしたいのかはっきりしません。これらの2つのコードスニペットは決して同等ではなく、まったく別のことを行います。

最初の文字列は、の引数としてリテラル文字列'`/home/swenson/rubyfunction1.rb`''`/home/swenson/rubyfunction2.rb`'を渡します。二つ目は、デフォルトのシステムシェル(Windowsの場合CMD.EXE、POSIX上/bin/sh)を使用して/home/swenson/rubyfunction1.rb/home/swenson/rubyfunction2.rbという名前 2つのファイルを実行しStringとして標準出力を取得し、requireにそれらの文字列を渡します。

注意第二の場合に、それらはKernel#`メソッドを呼び出すためのRubyの構文であるのに対し、場合には、バッククォート`は、ファイル名の一部であること。

+0

2番目は私がしたいことです。私は基本的に出力を要求できるようにしたい(簡単な言葉で言えば)。私は、出力を生成するスクリプトを実行するために、ルビーにデフォルトのシステムシェルを使用させたい。生成された出力は私が必要としたいものです。今までこのスレッドで見てきたレスポンスに基づいて、それは可能かもしれないとかなり楽観的でした:) – swenson

+0

あなたがしたいことはまだ私には不透明です。あなたは、ファイルを実行する出力を「必要とする」と言います。しかし、あなたは '**'パス**を必要とし、あなたのファイルはパスを出力せず、** code **を出力します。ですから、ファイルの出力を '要求する 'ことはできません。これは私には[* XY問題*](https://meta.stackexchange.com/q/66377/2988)のようなにおいがします。あなたは問題Xを持っていますが、解決策はYだと思いますが、問題をYを実装する、そして今あなたはあなたの問題Xを解決する方法の代わりにYを実装することであなたの問題について尋ねています。 –

関連する問題