রুবিতে __FILE__ এর অর্থ কী?


216

আমি রুবিতে সব সময় এটি দেখতে পাই:

require File.dirname(__FILE__) + "/../../config/environment"  

কী __FILE__মানে?


সাহায্যের টাই একসাথে রেফারেন্স করতে, তাও দেখতে ruby-forum.com/topic/143383 এবং stackoverflow.com/questions/4325759/...
টিনের মানুষ

উত্তর:


144

এটি বর্তমান ফাইলের নামের একটি রেফারেন্স। ফাইলটিতে foo.rb, __FILE__হিসাবে ব্যাখ্যা করা হবে"foo.rb"

সম্পাদনা করুন: লুব বয়েস তার মন্তব্যে যা বলেছিল তার থেকে রুবি ১.৯.২ এবং ১.৯.৩ কিছুটা আলাদা আচরণ করে বলে মনে হচ্ছে । এই ফাইলগুলির সাথে:

# test.rb
puts __FILE__
require './dir2/test.rb'
# dir2/test.rb
puts __FILE__

চলমান ruby test.rbআউটপুট হবে

test.rb
/full/path/to/dir2/test.rb

87
এই উত্তরটি সঠিক নয়। ফাইল "আপেক্ষিক" বর্তমান সঞ্চালনের ডিরেক্টরি থেকে ফাইল পাথ হয় - পরম নয়। পরম পাথ পেতে আপনাকে অবশ্যই ফাইল.এক্সপ্যান্ড_পথ ( ফাইল ) ব্যবহার করতে হবে
লুক বেইস

7
উপরের মন্তব্যের মধ্যে ডাবল আন্ডারস্কোর স্বয়ংক্রিয়ভাবে সরানো হয়েছে।
লুক বেইস

1
এটি এখনও রুবি ১.৯.২ এ সত্য?
জাজz

4
@ জাজ্জ এটি ১.৯.২-এ বিভিন্ন ধরণের কাজ করে। প্রাথমিকভাবে লোড হওয়া ফাইলটির একটি আপেক্ষিক __FILE__ রয়েছে, তবে অন্যান্য অন্তর্ভুক্ত / প্রয়োজনীয় ফাইলগুলির নিখুঁত পথ রয়েছে।
জেফ

9
@ লুকবেস আপনি ব্যাকটিক্স সহ আক্ষরিক পাঠকে ঘিরে স্ট্যাক ওভারফ্লো মন্তব্যগুলিতে আন্ডারস্কোর এবং অন্যান্য বিশেষ অক্ষর সংরক্ষণ করতে পারেন। `__FILE__`পেতে লিখুন __FILE__
ররি ও'কেনে

62

এর মানটি __FILE__একটি আপেক্ষিক পথ যা আপনার ফাইলটি লোড হওয়ার পরে তৈরি এবং সঞ্চয় করা হয় (তবে কখনই আপডেট হয় না)। এর অর্থ হ'ল যদি Dir.chdirআপনার অ্যাপ্লিকেশনটিতে অন্য কোথাও আপনার কাছে কোনও কল থাকে তবে এই পথটি ভুলভাবে প্রসারিত হবে।

puts __FILE__
Dir.chdir '../../'
puts __FILE__

এই সমস্যার সমাধানের জন্য একটি হ'ল __FILE__কোনও অ্যাপ্লিকেশন কোডের বাইরের প্রসারিত মান সংরক্ষণ করা । যতক্ষণ না আপনার requireবক্তব্যগুলি আপনার সংজ্ঞাগুলির শীর্ষে থাকে (বা কমপক্ষে কোনও কল করার আগে Dir.chdir), এই মানটি ডিরেক্টরি পরিবর্তন করার পরে কার্যকর হতে থাকবে।

$MY_FILE_PATH = File.expand_path(File.dirname(__FILE__))

# open class and do some stuff that changes directory

puts $MY_FILE_PATH

This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.পথটি আমার পরীক্ষার অধীনে সঠিকভাবে প্রসারিত হয়েছিল। আমার রুবি সংস্করণটি ২.৩.।, সম্ভবত নতুন রুবি সংস্করণটি এই সমস্যাটিকে ঠিক করেছে।
আলেক.জৌউ

28

__FILE__ কোডটি চালানো হচ্ছে এমন ফাইলের এক্সটেনশন সহ ফাইলের নাম।

ইন foo.rb, __FILE__"foo.rb" হবে।

তাহলে foo.rbDir ছিল /home/joshতারপর File.dirname(__FILE__)ফিরে আসবে /home/josh


ঠিক এই জন্য খুঁজছেন। +1: =) @ ইথান
কেএম রকিবুল ইসলাম

1
এখানে ডকুমেন্টেশন একটি লিঙ্ক
রস অ্যাট্রিল

17

উইন্ডোজ সংস্করণ রুবিতে যাইহোক, আমি কেবলমাত্র পরীক্ষা করেছিলাম এবং __FILE__ফাইলটির পুরো পথটি নেই। পরিবর্তে এটি ফাইলটি যেখানে এটি চালিত হচ্ছে তার সাথে সম্পর্কিত পথ রয়েছে contains

পিএইচপি- __FILE__তে সম্পূর্ণ পথ (যা আমার মতে পছন্দনীয়)। এ কারণেই, রুবিতে আপনার পাথগুলি পোর্টেবল করার জন্য, আপনাকে সত্যই এটি ব্যবহার করতে হবে:

File.expand_path(File.dirname(__FILE__) + "relative/path/to/file")

আমার নোট করা উচিত যে রুবি ১.৯.১ __FILE__এ ফাইলের পুরো পথ রয়েছে, উপরের বর্ণনাটি ছিল যখন আমি রুবি ১.৮..7 ব্যবহার করেছি।

রুবি 1.8.7 এবং 1.9.1 উভয়ের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য (1.9 সম্পর্কে নিশ্চিত নয়) আপনার উপরেরটি দেখানো কনস্ট্রাক্ট ব্যবহার করে আপনার ফাইলের প্রয়োজন should


আপনাকে আপনার আপেক্ষিক পথে স্ল্যাশ প্রিপেন্ড করতে হবে:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
ফেলিক্স রাবে

3
আপনি কখনই ডিরেক্টরি বিভাজক হার্ড-কোড করা উচিত নয়। পরিবর্তে ফাইল.জয়িন ব্যবহার করুন:File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
অ্যান্ড্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.