রুবি গটচাস কী সম্পর্কে একজন নবজাতকে সতর্ক হওয়া উচিত? [বন্ধ]


108

আমি সম্প্রতি রুবি প্রোগ্রামিং ভাষা শিখেছি এবং সব মিলিয়ে এটি একটি ভাল ভাষা। তবে আমি এতটা অবাক হয়ে দেখলাম যে এটি আমার প্রত্যাশার মতো সহজ ছিল না। আরও স্পষ্টভাবে, "সর্বনিম্ন-বিস্ময়ের নিয়ম" আমার কাছে খুব শ্রদ্ধাজনক বলে মনে হয় নি (অবশ্যই এটি বেশ বিষয়গত)। উদাহরণ স্বরূপ:

x = true and false
puts x  # displays true!

এবং বিখ্যাত:

puts "zero is true!" if 0  # zero is true!

অন্য কোন "গটচস" আপনি কোন রুবি নবাগত সম্পর্কে সতর্ক করবেন?


@ શબ્દસમૂહ.insert (0, পি) ঠিক আছে @ ফ্রেইজস.সিনেট (পি) কিছুই ঘটে না @ ফ্রেস << পি # ঠিক আছে
Anno2001

true and falseসত্য কেন ফিরে আসে ?
জর্জেন পল

3
কারণ "x = সত্য এবং মিথ্যা" আসলে "(x = সত্য) এবং মিথ্যা" হিসাবে ব্যাখ্যা করা হয়। এটি অপারেটর অগ্রাধিকারের বিষয়: "এবং" এর তুলনায় "=" এর চেয়ে কম অগ্রাধিকার রয়েছে। বেশিরভাগ অন্যান্য ভাষার বিপরীত অগ্রাধিকার রয়েছে, আমি জানি না যে তারা কেন এই আদেশটি রেলগুলিতে বেছে নিয়েছিল, আমি এটি খুব বিভ্রান্তিকর বলে মনে করি। আপনি যদি "স্বাভাবিক" আচরণ চান, কেবল "x = (সত্য এবং মিথ্যা)" টাইপ করুন, তবে এক্স মিথ্যা হবে।
MiniQuark

4
আর একটি সমাধান হ'ল "&&" এবং "||" ব্যবহার করা "এবং" এবং "বা" পরিবর্তে: তারা প্রত্যাশা অনুযায়ী আচরণ করে। উদাহরণস্বরূপ: "x = সত্য && মিথ্যা" x এর ফলস্বরূপ মিথ্যা।
MiniQuark

"ন্যূনতম বিস্ময়ের মূলনীতিটি আমার অবাক হওয়ার মূলনীতি means " en.wikedia.org/wiki/Ruby_ ( প্রোগ্রামগ্রামিং_এলংয়েজ) থেকে ## দর্শন পাইথনের ক্ষেত্রেও একই রকম। পাইথনের নির্মাতা সম্পর্কে আমার অনুরূপ উক্তি ছিল তবে আমি কোথায় ছিল তা ভুলে গিয়েছি।
দারেক নডজা

উত্তর:


59

উইকিপিডিয়া রুবি গোটচাস

নিবন্ধ থেকে:

  • বড় অক্ষর দিয়ে শুরু হওয়া নামগুলি ধ্রুবক হিসাবে বিবেচিত হয়, তাই স্থানীয় ভেরিয়েবলগুলি ছোট হাতের অক্ষর দিয়ে শুরু করা উচিত।
  • অক্ষরগুলি $এবং @পার্ল হিসাবে ভেরিয়েবল ডেটা টাইপ নির্দেশ করে না, বরং স্কোপ রেজুলেশন অপারেটর হিসাবে কাজ করে।
  • ভাসমান পয়েন্ট সংখ্যাগুলি বোঝাতে, অবশ্যই একটি শূন্য অঙ্ক ( 99.0) বা একটি সুস্পষ্ট রূপান্তর ( 99.to_f) সহ অনুসরণ করতে হবে । এটি একটি বিন্দু ( 99.) সংযোজন অপর্যাপ্ত , কারণ সংখ্যা পদ্ধতি বাক্য গঠনতে সংবেদনশীল।
  • অ বুলিয়ান ডাটা বুলিয়ান মূল্যায়ন কঠোর: 0, ""এবং []সব থেকে মূল্যায়ন করা হয় true। সিতে, অভিব্যক্তিটি 0 ? 1 : 0মূল্যায়ন করে 0(অর্থাত মিথ্যা)। তবে রুবিতে, ফলন হয় 1, যেমন সমস্ত সংখ্যা মূল্যায়ন করে true; শুধুমাত্র nilএবং falseমূল্যায়ন false। এই নিয়মের একটি প্রকোষ্ঠ হ'ল কনবিভেনশন অনুসারে রুবি পদ্ধতিগুলি - উদাহরণস্বরূপ, নিয়মিত-এক্সপ্রেশন অনুসন্ধানগুলি - রিটার্ন নম্বর, স্ট্রিং, তালিকাগুলি, বা সাফল্যের জন্য অন্যান্য অ-মিথ্যা মানগুলি, তবে nilব্যর্থতার (উদাহরণস্বরূপ, মেলে না)। এই কনভেনশনটি স্মলটাল্কেও ব্যবহৃত হয়, যেখানে কেবল বিশেষ সামগ্রী trueএবং falseবুলিয়ান অভিব্যক্তি হিসাবে ব্যবহার করা যেতে পারে।
  • 1.9 এর আগের সংস্করণগুলিতে একটি অক্ষর ডেটা টাইপের অভাব রয়েছে (সি এর সাথে তুলনা করুন, যা charঅক্ষরের জন্য প্রকার সরবরাহ করে )। স্ট্রিংগুলি কাটানোর সময় এটি আশ্চর্য হতে পারে: "abc"[0]ফলন 97(একটি পূর্ণসংখ্যা, স্ট্রিংয়ের প্রথম অক্ষরের ASCII কোড উপস্থাপন করে); প্রাপ্ত "a"ব্যবহার "abc"[0,1]বা (দৈর্ঘ্য 1 একটি সাবস্ট্রিং) "abc"[0].chr
  • statement until expressionঅন্যান্য ভাষার সমতুল্য বক্তব্যগুলির (যেমন do { statement } while (not(expression));সি / সি ++ / ... এর মধ্যে) বিপরীতে স্বরলিপিটি প্রকাশিত শব্দটি ইতিমধ্যে উপস্থিত থাকলে কখনও বিবৃতি চালায় না true। এটি কারণ statement until expressionসিন্ট্যাকটিক চিনির বেশি

    until expression
      statement
    end
    

    , সমতুল্য যা সি এর / সি ++ হয় while (not(expression)) statement;ঠিক statement if expressionএকটি সমতূল্য

    if expression
      statement
    end
    

    তবে, স্বরলিপি

    begin
      statement
    end until expression
    

    রুবি প্রকৃতপক্ষে সত্য প্রকাশ হলেও একবারে বিবৃতিটি চালাবে।

  • কারণ ধ্রুবক হ'ল অবজেক্টের রেফারেন্স, ধ্রুবকটি যা বোঝায় তা পরিবর্তিত করে একটি সতর্কতা উত্পন্ন করে তবে অবজেক্টটি নিজেই সংশোধন করে না। উদাহরণস্বরূপ, Greeting << " world!" if Greeting == "Hello"ত্রুটি বা সতর্কতা উত্পন্ন করে না। এটি finalজাভাতে ভেরিয়েবলের মতো , তবে জাবি থেকে আলাদা হয়ে কোনও বস্তুকে "হিমায়িত" করার জন্য রুবির কার্যকারিতাও রয়েছে।

কিছু বৈশিষ্ট্য যা অন্যান্য ভাষার থেকে উল্লেখযোগ্যভাবে পৃথক:

  • শর্তসাপেক্ষ অভিব্যক্তিগুলির জন্য সাধারণ অপারেটরগুলি, andএবং orঅগ্রাধিকারের সাধারণ নিয়মগুলি অনুসরণ andকরে না : এর চেয়ে কঠোরভাবে আবদ্ধ হয় না or। রুবির এক্সপ্রেশন অপারেটরও রয়েছে ||এবং &&যা প্রত্যাশা অনুযায়ী কাজ করে।

  • defভিতরে defপাইথন প্রোগ্রামার আশা করতে পারে না:

    def a_method
        x = 7
        def print_x; puts x end
        print_x
    end
    

    এটি xসংজ্ঞায়িত না হওয়ার বিষয়ে ত্রুটি দেয় । আপনি একটি ব্যবহার করতে হবে Proc

ভাষার বৈশিষ্ট্য সমূহ

  • পদ্ধতিগুলি একাধিক পরামিতি গ্রহণ করে যদি পদ্ধতি আর্গুমেন্টের আশেপাশে প্রথম বন্ধনীর অপ্রত্যাশিত ফলাফল হতে পারে। রুবি বিকাশকারীরা জানিয়েছেন যে মাল্টি-প্যারামিটার পদ্ধতিতে প্রথম বন্ধনী বাদ দেওয়া ভবিষ্যতের রুবি সংস্করণে অনুমোদিত নয়; বর্তমান (নভেম্বর ২০০)) রুবি ইন্টারপ্রেটার একটি সতর্কতা নিক্ষেপ করেছেন যা লেখককে বাদ না দেওয়া (), কোডের অস্পষ্ট অর্থ এড়ানোর জন্য উত্সাহ দেয় । ব্যবহার না করা ()এখনও সাধারণ অনুশীলন, এবং রুবিকে একটি মানব পাঠযোগ্য ডোমেন-নির্দিষ্ট প্রোগ্রামিং ভাষা হিসাবে ডাকা পদ্ধতির পাশাপাশি ব্যবহার করা বিশেষত চমৎকার হতে পারে method_missing()

1
রুবি ১.৯-তে অক্ষরের ডেটা টাইপও নেই। 1.8 সালে, সূচক অপারেটর একটি ফিক্সনাম ফিরিয়ে দেয়; 1.9-এ, এটি একটি-অক্ষরযুক্ত স্ট্রিং কাটানোর সমতুল্য।
হোয়াইটবার্ক

38

সাম্য পদ্ধতিতে নবীনদের সমস্যা হবে :

  • a == খ : a এবং b সমান কিনা তা পরীক্ষা করে। এটি সবচেয়ে দরকারী।
  • a.eql? b : a এবং b সমান কিনা তাও পরীক্ষা করে তবে এটি কখনও কখনও আরও কঠোর হয় (উদাহরণস্বরূপ এটি এবং এবং বি একই ধরণের রয়েছে কিনা তা পরীক্ষা করতে পারে)। এটি প্রধানত হ্যাশগুলিতে ব্যবহৃত হয়।
  • a.equal? b : a এবং b একই বস্তু (পরিচয় চেক) কিনা তা যাচাই করে।
  • a === খ : ক্ষেত্রে বিবৃতিতে ব্যবহৃত (আমি এটি " একটি ম্যাচ বি " হিসাবে পড়েছি )।

এই উদাহরণগুলির মধ্যে প্রথম 3 টি পদ্ধতি পরিষ্কার করা উচিত:

a = b = "joe"

a==b       # true
a.eql? b   # true
a.equal? b # true (a.object_id == b.object_id)

a = "joe"
b = "joe"

a==b       # true
a.eql? b   # true
a.equal? b # false (a.object_id != b.object_id)

a = 1
b = 1.0

a==b       # true
a.eql? b   # false (a.class != b.class)
a.equal? b # false

নোট যে == , একল? এবং সমান? সর্বদা প্রতিসম হতে হবে: যদি a == খ তারপর খ == ক।

এছাড়াও নোট করুন == এবং একল? উভয়ই ক্লাস অবজেক্টে ইক্যুইটি অবহিত হিসাবে প্রয়োগ করা হয়? , সুতরাং আপনি যদি একটি নতুন শ্রেণি তৈরি করেন এবং == এবং একল চান ? সরল পরিচয় ব্যতীত অন্য কিছু বোঝার জন্য আপনাকে তখন উভয়কেই ওভাররাইড করতে হবে। উদাহরণ স্বরূপ:

class Person
    attr_reader name
    def == (rhs)
      rhs.name == self.name  # compare person by their name
    end
    def eql? (rhs)
      self == rhs
    end
    # never override the equal? method!
end

=== পদ্ধতি ভিন্নভাবে আচরণ করে। প্রথমত এটি প্রতিসম নয় (a === b যে খ === ক বোঝায় না )। আমি যেমন বলেছি, আপনি a === b "" ম্যাচ বি "হিসাবে পড়তে পারেন। এখানে কিছু উদাহরণ আছে:

# === is usually simply an alias for ==
"joe" === "joe"  # true
"joe" === "bob"  # false

# but ranges match any value they include
(1..10) === 5        # true
(1..10) === 19       # false
(1..10) === (1..10)  # false (the range does not include itself)

# arrays just match equal arrays, but they do not match included values!
[1,2,3] === [1,2,3] # true
[1,2,3] === 2       # false

# classes match their instances and instances of derived classes
String === "joe"   # true
String === 1.5     # false (1.5 is not a String)
String === String  # false (the String class is not itself a String)

কেস বিবৃতি উপর ভিত্তি করে তৈরি === পদ্ধতি:

case a
  when "joe": puts "1"
  when 1.0  : puts "2"
  when (1..10), (15..20): puts "3"
  else puts "4"
end

এর সমতুল্য:

if "joe" === a
  puts "1"
elsif 1.0 === a
  puts "2"
elsif (1..10) === a || (15..20) === a
  puts "3"
else
  puts "4"
end

আপনি যদি কোনও নতুন শ্রেণীর সংজ্ঞা দেন যার উদাহরণস্বরূপ কোনও ধরণের ধারক বা ব্যাপ্তি উপস্থাপন করে (যদি এর কোনও কিছু অন্তর্ভুক্ত? বা ম্যাচ? পদ্ধতি) থাকে তবে আপনি এই জাতীয় === পদ্ধতিটিকে ওভাররাইড করতে দরকারী হতে পারেন:

class Subnet
  [...]
  def include? (ip_address_or_subnet)
    [...]
  end
  def === (rhs)
    self.include? rhs
  end
end

case destination_ip
  when white_listed_subnet: puts "the ip belongs to the white-listed subnet"
  when black_listed_subnet: puts "the ip belongs to the black-listed subnet"
  [...]
end

1
এছাড়াও: a = 'строка'; খ = 'строка'; প == খ; a = a.for_encoding 'ASCII-8BIT'; b = b.for_encoding 'UTF-8'; প == খ; প === খ; p a.eql? বি; পি a.equal? খ
নকিলন

20
  • বানর প্যাচিং । রুবির ওপেন ক্লাস রয়েছে তাই রানটাইমের সময় তাদের আচরণটি পরিবর্তনশীল ...

  • অবজেক্টস পারে অনির্ধারিত পদ্ধতি সাড়া যদি method_missingবা sendওভাররাইড করা হয়েছে। এটি রুবির বার্তা-ভিত্তিক পদ্ধতির অনুরোধ কাজে লাগায়। পাগল ' ActiveRecord সিস্টেম মহান মর্মে এই ব্যবহার করে।


18

নিম্নলিখিত কোডটি আমাকে অবাক করেছে। আমি মনে করি এটি একটি বিপজ্জনক গোচা: উভয়ই চালানো সহজ, এবং ডিবাগ করা শক্ত।

(1..5).each do |number|
  comment = " is even" if number%2==0
  puts number.to_s + comment.to_s
end

এই মুদ্রণ:

1
2 is even
3
4 is even
5

তবে আমি যদি ব্লকের আগে comment =কিছু যোগ করি ...

comment = nil
(1..5).each do |number|
  comment = " is even" if number%2==0
  puts number.to_s + comment.to_s
end

তারপরে আমি পেয়েছি:

1
2 is even
3 is even
4 is even
5 is even

মূলত, যখন কোনও ভেরিয়েবল কেবল একটি ব্লকের ভিতরে সংজ্ঞায়িত করা হয়, তারপরে এটি ব্লকের শেষে ধ্বংস হয়ে যায় এবং তারপরে এটি nilপ্রতিটি পুনরাবৃত্তির উপর পুনরায় সেট হয় । এটি সাধারণত আপনি প্রত্যাশা করেন। তবে যদি ভেরিয়েবলটি ব্লকের আগে সংজ্ঞায়িত করা হয় , তবে বহিরাগত ভেরিয়েবলটি ব্লকের অভ্যন্তরে ব্যবহৃত হয় এবং এর মান তাই পুনরাবৃত্তির মধ্যে স্থির থাকে।

এর পরিবর্তে একটি সমাধান হ'ল এটি:

comment = number%2==0 ? " is even" : nil

আমি মনে করি অনেক লোক (আমাকে সহ) " a = b if c" এর পরিবর্তে " " লেখার ঝোঁক a = (c ? b : nil)রাখেন, কারণ এটি আরও পাঠযোগ্য, তবে স্পষ্টতই এর পার্শ্ব-প্রতিক্রিয়া রয়েছে।


4
আপনি ঠিক সেই সাথে বহিরাগত স্কোপ ভেরিয়েবলের ছায়াও করতে পারেন (1..5) do | সংখ্যা; মন্তব্য | দ্বারা ..... এখানে স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি

6
এটা আমার কাছে যৌক্তিক মনে হয়। এই স্কোপিং অন্যান্য ভাষাগুলির মতো সাধারণ, এটি কেবল বাক্য গঠন যা আলাদা।
ছ।

যাইহোক, আপনি a = (b if c)টার্নারি ছাড়াই পছন্দসই প্রভাব পেতে লিখতে পারেন । এটি মিথ্যা b if cহলে শূন্য করার জন্য মূল্যায়ন করে cis
ক্যামেরন মার্টিন

16

superকোনও যুক্তি ছাড়াই কল করার সময় , ওভাররাইড পদ্ধতিটি ওভাররাইড পদ্ধতি হিসাবে একই আর্গুমেন্টের সাথে আসলে ডাকা হয়।

class A
  def hello(name="Dan")
    puts "hello #{name}"
  end
end

class B < A
  def hello(name)
    super
  end
end

B.new.hello("Bob") #=> "hello Bob"

আসলে superকোনও যুক্তি ছাড়াই কল করার জন্য আপনাকে বলতে হবে super()


3
যদি B#helloএর name = 42আগে থাকে superতবে এটি "হ্যালো ৪২" বলে।
অ্যান্ড্রু গ্রিম

14

ব্লক এবং পদ্ধতিগুলি ডিফল্টরূপে শেষ লাইনের মান ফেরত দেয়। যোগ করার পদ্ধতি putsডিবাগ করার উদ্দেশ্যে জন্য শেষ বিবৃতি অপ্রীতিকর পার্শ্ব প্রতিক্রিয়া সৃষ্টি করতে পারে


13

বাহ, এটি একটি গোটচা যার সম্পর্কে আমি জানতাম না। ধন্যবাদ!
MiniQuark

এটি সুরক্ষিত পদ্ধতিগুলির ক্ষেত্রে হয় বরং জটিল পদ্ধতিতে।
taw

11

ক্লাস ভেরিয়েবল, ক্লাস অ্যাট্রিবিউটস এবং ক্লাসের পদ্ধতিগুলি বুঝতে আমার প্রচুর সমস্যা হয়েছিল। এই কোডটি কোনও নবাগতকে সহায়তা করতে পারে:

class A
  @@classvar = "A1"
  @classattr = "A2"
  def self.showvars
    puts "@@classvar => "+@@classvar
    puts "@classattr => "+@classattr
  end
end

A.showvars
  # displays:
  # @@classvar => A1
  # @classattr => A2

class B < A
  @@classvar = "B1"
  @classattr = "B2"
end

B.showvars
  # displays:
  # @@classvar => B1
  # @classattr => B2

A.showvars
  # displays:
  # @@classvar => B1   #Class variables are shared in a class hierarchy!
  # @classattr => A2   #Class attributes are not

1
হ্যাঁ, ক্লাস ভেরিয়েবলগুলি কৌশলযুক্ত হতে পারে। আমি মনে করি বেশিরভাগ অভিজ্ঞ রুবিবাদীরা বলবেন যে এগুলি এড়ানো বুদ্ধিমানের কাজ, কারণ এগুলি ছাড়া সমস্যা সমাধানের জন্য সাধারণত অন্যান্য উপায় রয়েছে। কিছু ভাষা উত্সাহী এমনকি এমনও বলতে পারেন যে রুবির ক্লাস ভেরিয়েবলগুলি ভাষা স্তরে খুব কম নকশাকৃত।
ডেভিড জে।

8

আমি শিখেছি একটি জিনিস অপারেটর ব্যবহার করা ছিল = = সাবধানে। এবং আপনি যদি বুলিয়ানগুলির সাথে কাজ করে থাকেন তবে বিশেষ যত্ন নিন। সমস্ত কিছু যদি ব্যর্থ হয় এবং 'ক' শূন্য থাকে তবে আমি সাধারণত '||' কে একটি ডিফল্ট মান দিতে ক্যাচ হিসাবে সমস্ত ব্যবহার করি। তবে যদি একটি মিথ্যা এবং খ সত্য হয়, তবে একটি সত্য হিসাবে নির্ধারিত হবে।


আপনি ব্যবহার করতে পারেন a = b if a.nil?বা @a = b unless defined?(@a)
অ্যান্ড্রু গ্রিম

8
  • ব্লকগুলি বোঝার জন্য সত্যই গুরুত্বপূর্ণ, সেগুলি সর্বত্র ব্যবহৃত হয়।

  • পদ্ধতির পরামিতিগুলির আশেপাশে আপনার কোনও বন্ধনী দরকার নেই। আপনি সেগুলি ব্যবহার করুন বা না করুন তা আপনার উপর নির্ভর করে। কেউ কেউ বলেন আপনার এগুলি সর্বদা ব্যবহার করা উচিত

  • ব্যতিক্রম হ্যান্ডলিংয়ের জন্য উত্থাপন এবং উদ্ধার ব্যবহার করুন, নিক্ষিপ্ত এবং ধরা না

  • আপনি ব্যবহার করতে পারেন ;তবে আপনি এক লাইনে একাধিক জিনিস রাখতে না চাইলে আপনার দরকার নেই।


যদি আপনি রুবি ১.৮..6 ছাড়িয়ে যাওয়ার পরিকল্পনা না করেন তবে প্যারেনগুলি আপনার পছন্দ মতো উপেক্ষা করুন। অন্যথায়, আপনি সম্ভবত তাদের ব্যবহার করা ভাল better
মাইক উডহাউস

7

আমি মিশ্রণগুলির সাথে সমস্যায় পড়েছিলাম যার মধ্যে উদাহরণ পদ্ধতি এবং ক্লাস পদ্ধতি রয়েছে। এই কোডটি কোনও নবাগতকে সহায়তা করতে পারে:

module Displayable
  # instance methods here
  def display
    puts name
    self.class.increment_displays
  end
  def self.included(base)
    # This module method will be called automatically
    # after this module is included in a class.
    # We want to add the class methods to the class.
    base.extend Displayable::ClassMethods
  end
  module ClassMethods
    # class methods here
    def number_of_displays
      @number_of_displays # this is a class attribute
    end
    def increment_displays
      @number_of_displays += 1
    end
    def init_displays
      @number_of_displays = 0
    end
    # this module method will be called automatically
    # after this module is extended by a class.
    # We want to perform some initialization on a
    # class attribute.
    def self.extended(base)
      base.init_displays
    end
  end
end

class Person
  include Displayable
  def name; @name; end
  def initialize(name); @name=name; end
end

puts Person.number_of_displays # => 0
john = Person.new "John"
john.display # => John
puts Person.number_of_displays # => 1
jack = Person.new "Jack"
jack.display # => Jack
puts Person.number_of_displays # => 2

প্রথমে, আমি ভেবেছিলাম যে কেবলমাত্র এটি করে আমার উদাহরণ পদ্ধতি এবং শ্রেণিক পদ্ধতি উভয়ই মডিউল থাকতে পারে :

module Displayable
  def display
    puts name
    self.class.increment_displays
  end
  def self.number_of_displays  # WRONG!
    @number_of_displays
  end
  [...]
end

দুর্ভাগ্যক্রমে, পদ্ধতি নম্বর_ের_দর্শনগুলি কখনই অন্তর্ভুক্ত বা প্রসারিত হবে না কারণ এটি একটি "মডিউল শ্রেণি পদ্ধতি" method কেবলমাত্র "মডিউল উদাহরণ পদ্ধতিগুলি" শ্রেণিতে অন্তর্ভুক্ত করা যেতে পারে (উদাহরণ পদ্ধতি হিসাবে) বা শ্রেণিতে প্রসারিত করা যেতে পারে (শ্রেণি পদ্ধতি হিসাবে)। এজন্য আপনাকে আপনার মেশিনের উদাহরণ পদ্ধতিগুলি একটি মডিউলে এবং আপনার মিক্সিনের ক্লাসের পদ্ধতিগুলি অন্য একটি মডিউলে রাখার প্রয়োজন হয় (আপনি সাধারণত ক্লাসের পদ্ধতিগুলিকে "ক্লাসমেথডস" সাবমডিউলে রেখে দেন)। অন্তর্ভুক্ত যাদু পদ্ধতিটির জন্য ধন্যবাদ , আপনি কেবলমাত্র একটি সাধারণ "অন্তর্ভুক্ত প্রদর্শনের যোগ্য" কলটিতে (উপরের উদাহরণে দেখানো হয়েছে) উদাহরণস্বরূপ পদ্ধতি এবং শ্রেণি পদ্ধতি উভয়ই অন্তর্ভুক্ত করা সহজ করে তুলতে পারেন।

এই মিশ্রণটি প্রতিটি প্রদর্শন প্রতি ক্লাস ভিত্তিতে গণনা করবে । কাউন্টারটি একটি শ্রেণীর বৈশিষ্ট্য, সুতরাং প্রতিটি শ্রেণীর নিজস্ব নিজস্ব বৈশিষ্ট্য থাকবে (আপনি যদি ব্যাক্তিগত শ্রেণীর থেকে একটি নতুন শ্রেণি অর্জন করেন তবে আপনার প্রোগ্রামটি ব্যর্থ হবে যেহেতু উদ্ভূত শ্রেণীর @Number_of_displays কাউন্টারটি আরম্ভ করা হবে না)। আপনি প্রতিস্থাপন করতে চান হতে পারে @number_of_displays দ্বারা @@ number_of_displays এটি একটি বিশ্বব্যাপী পাল্টা করতে। এই ক্ষেত্রে, প্রতিটি শ্রেণি শ্রেণিবিন্যাসের নিজস্ব কাউন্টার থাকবে। আপনি যদি একটি বিশ্বব্যাপী এবং অনন্য কাউন্টার চান তবে আপনার সম্ভবত এটি একটি মডিউল বৈশিষ্ট্য হওয়া উচিত।

আমি রুবির সাথে যখন শুরু করি তখন এগুলি অবশ্যই আমার পক্ষে স্বজ্ঞাত ছিল না।

আমি কীভাবে পরিষ্কারভাবে এই মিক্সিন পদ্ধতিগুলির কয়েকটি ব্যক্তিগত বা সুরক্ষিত তৈরি করতে পারি তা এখনও বুঝতে পারি না (কেবলমাত্র প্রদর্শন এবং নম্বর_এক_দর্শনীয় পদ্ধতিটি পাবলিক পদ্ধতি হিসাবে অন্তর্ভুক্ত করা উচিত)।


7

ব্যাপ্তি স্বরলিপি মনোযোগ দিন।

(কমপক্ষে, আমি প্রথম দিকে যতটা মনোনিবেশ করেছি তার চেয়ে বেশি মনোযোগ দিন !)

0..10 (দুটি বিন্দু) এবং 0...10(তিনটি বিন্দু) মধ্যে পার্থক্য রয়েছে ।

আমি রুবি একটি মহান চুক্তি উপভোগ। তবে এই ডট-ডট বনাম ডট-ডট-ডট জিনিসটি আমাকে বাগিয়ে দেয়। আমি মনে করি যে এটি একটি সূক্ষ্ম দ্বৈত-বাক্য গঠন "বৈশিষ্ট্য" যা:

  • ভুল টাইপ করা সহজ, এবং
  • কোডটি ঝলকানোর সময় আপনার চোখের সাথে মিস করা সহজ

আমার প্রোগ্রামগুলিতে একের পর এক ধ্বংসাত্মক বাগ তৈরি করতে সক্ষম হওয়া উচিত নয়।


1
for (i=0; i<max; i++)এবংfor (i=0; i<=max; i++)
জি

আমি 0..10 এবং 0 ... 10 এর মধ্যে পার্থক্য কী তা জানার চেষ্টা করছি।
লুইস ডি উরাকা

6

আমি মনে করি " and" এবং " or" পার্লের পক্ষে সম্মতি জানায় যা রুবির অন্যতম স্পষ্ট “পিতা-মাতা” (সর্বাধিক বিশিষ্ট অন্যটি হ'ল স্মার্টটাক)। তাদের উভয়ের অনেক কম অগ্রাধিকার রয়েছে (কার্যভারের চেয়ে কম, বাস্তবে, যেটি উল্লিখিত আচরণটি এসেছে) &&এবং ||কোন অপারেটর আপনাকে ব্যবহার করা উচিত be

এ সম্পর্কে সচেতন হওয়ার মতো অন্যান্য জিনিস অবিলম্বে সুস্পষ্ট নয়:

আপনি সত্যিই পদ্ধতিগুলি / ফাংশনগুলিকে কল করবেন না, যদিও এটি দুর্দান্ত দেখায়। পরিবর্তে, স্মলটালকের মতো, আপনি কোনও বস্তুতে একটি বার্তা প্রেরণ করেন। তাই method_missingসত্যিই আরও পছন্দ message_not_understood

some_object.do_something(args)

সমতুল্য

some_object.send(:do_something, args) # note the :

প্রতীকগুলি খুব ব্যাপকভাবে ব্যবহৃত হয়। :এগুলিই সেই জিনিসগুলির সাথে শুরু হয় এবং সেগুলি তাত্ক্ষণিকভাবে সুস্পষ্ট হয় না (ভাল তারা আমার কাছে ছিল না) তবে আপনি আগে তাদের সাথে আরও ভালভাবে আঁকড়ে ধরেন।

রুবি "হাঁস-টাইপিং" এর উপরে প্রধান, যে "যদি এটি হাঁসের মতো হাঁটতে থাকে এবং হাঁসের মতো ঝাঁকুনি দেয় ..." যা কোনও স্পষ্ট উত্তরাধিকার বা মিক্সিন সম্পর্ক ছাড়াই পদ্ধতির সাধারণ উপসেটযুক্ত অবজেক্টগুলিকে অনানুষ্ঠানিক প্রতিস্থাপনের অনুমতি দেয়।


ধন্যবাদ। প্রেরণ পদ্ধতি সম্পর্কে আমি একটা জিনিস ঘৃণা করি : এটি আপনাকে ক্লাসের বাইরেও ব্যক্তিগত পদ্ধতিগুলি কল করতে দেয়! সেকি।
MiniQuark

1
@ মিনিকিয়ার্ক: প্রেরণ পদ্ধতিটি সম্পর্কে আমি এটিই পছন্দ করি!
অ্যান্ড্রু গ্রিম

6

যদি আপনি কোনও সেটার (ওরফে মিউটর) ব্যবহার করে attr_writerবা attr_accessor(বা def foo=) ঘোষণা করেন তবে শ্রেণীর ভিতরে থেকে এটি কল করার বিষয়ে সাবধান হন। যেহেতু ভেরিয়েবল সুস্পষ্টভাবে ঘোষণা করা হয়, দোভাষীকে সর্বদা foo = barপদ্ধতিটি কল করার পরিবর্তে foo নামে একটি নতুন ভেরিয়েবল ঘোষণার সমাধান করতে হবে self.foo=(bar)

class Thing
  attr_accessor :foo
  def initialize
    @foo = 1      # this sets @foo to 1
    self.foo = 2  # this sets @foo to 2
    foo = 3       # this does *not* set @foo
  end
end

puts Thing.new.foo #=> 2

এটি রেলস অ্যাক্টিভেকর্ড অবজেক্টগুলিতেও প্রযোজ্য, যা ডাটাবেসে ক্ষেত্রের উপর ভিত্তি করে সংজ্ঞায়িত সংস্থাগুলি পান। যেহেতু তারা এমনকি @-স্টাইলের উদাহরণের ভেরিয়েবলও নয়, সেই মানগুলি পৃথকভাবে সেট করার উপযুক্ত উপায়টি সাথে হয় self.value = 123বা হয় self['value'] = 123


5

সময় এবং তারিখ শ্রেণীর মধ্যে পার্থক্য বোঝা। উভয়ই পৃথক এবং রেলগুলিতে এগুলি ব্যবহার করার সময় সমস্যা তৈরি করেছে। সময় শ্রেণি মাঝে মাঝে স্ট্যান্ডার্ড রুবি / রেল লাইব্রেরিতে উপস্থিত অন্যান্য টাইম ক্লাসের লাইব্রেরিগুলির সাথে দ্বন্দ্ব করে। আমার রেল অ্যাপ্লিকেশনটিতে ঠিক কী চলছে তা বুঝতে ব্যক্তিগতভাবে এটি আমাকে অনেক সময় নিয়েছিল। পরে, আমি যখন বুঝতে পেরেছি

Time.new

এটি এমন কোনও স্থানে কিছু লাইব্রেরির কথা উল্লেখ করছিল যা আমি জানতাম না।

আমি ঠিক কী বলতে চাই তার সাথে আমি পরিষ্কার না হলে দুঃখিত। অন্যরা যদি একই ধরণের সমস্যার মুখোমুখি হন তবে দয়া করে পুনরায় ব্যাখ্যা করুন।


4

অতীতে আমাকে যে ধরা পড়েছিল তা হ'ল নতুন লাইনের চরিত্র ( \n) অব্যাহতি ক্রম - অন্যদের মধ্যে - একক উদ্ধৃতিতে স্ট্রিং দ্বারা সমর্থিত নয়। ব্যাকস্ল্যাশ নিজেই পালিয়ে যায়। আশানুরূপভাবে কাজ করতে আপনাকে পালানোর জন্য ডাবল কোট ব্যবহার করতে হবে।


1
এবং এটি অন্য কোন ভাষা থেকে আলাদা?
রবার্ট গ্যাম্বল 21

জাভা, এক জন্য। জাভাতে একক উদ্ধৃতি কেবল স্ট্রিংস নয়, একটি একক চর বদ্ধ করতে ব্যবহৃত হতে পারে।
জন টপলি 21

1
এটি এমন কোনও ভাষার সাথে মিল রেখে যা আপনাকে স্ট্রিংয়ের জন্য একক উদ্ধৃতি ব্যবহার করতে দেয় এবং সে কারণেই তারা তা করে।
সিঙ্গপোলিমা

@ জন: সত্য, তবে জাভাতে '\ n' এখনও নতুন লাইনের চরিত্র হবে।
উয়র্ন

1
তবে জাভাতে একক উদ্ধৃতিতে কেবল প্রকারের মানের মান তৈরি হয়। স্ট্রিং নয় এটাই পার্থক্য।
jmucchiello

4
x = (true and false) # x is false

0 এবং '' সত্য, যেমন আপনি উল্লেখ করেছেন।

আপনার একই নাম অনুসারে একটি পদ্ধতি এবং একটি মডিউল / শ্রেণি থাকতে পারে (যা বোঝায়, কারণ পদ্ধতিটি আসলে অবজেক্টে যুক্ত হয় এবং এর নিজস্ব নাম স্থান রয়েছে)।

এখানে একাধিক উত্তরাধিকার নেই, তবে ঘন ঘন "মিক্সিন মডিউল" একাধিক শ্রেণিতে সাধারণ পদ্ধতি যুক্ত করতে ব্যবহৃত হয়।


0 == সত্য // আমার মস্তিস্কে সি সংকলকটি বিস্ফোরিত হচ্ছে !!
কেনে

1
0 == সত্য রুবিতে মিথ্যা দেয়। যে 0 টি সত্য তা বোধগম্য কারণ সত্য রুবির একটি বস্তু। সি 0 তে কেবল মিথ্যা হিসাবে একই প্রতিনিধিত্ব রয়েছে।
জুলাই 13

রুবিতে একটি শর্তে, শুধুমাত্র falseএবং nilমিথ্যা। অন্য সকল সত্যই মূল্যবান।
রুবিপ্রিন্স

4

পদ্ধতিগুলি নতুন করে সংজ্ঞায়িত করা যেতে পারে এবং আপনি কারণ আবিষ্কার না করা অবধি মাইন্ড স্ক্র্যাচারে পরিণত হতে পারে। ( স্বীকারোক্তি হিসাবে, এই ত্রুটিটি সম্ভবত রেল কন্ট্রোলারের কোনও রুবিকে ভুল দ্বারা পুনরায় সংজ্ঞায়িত করা হলে সনাক্ত করা কিছুটা "কঠিন" ) !

#demo.rb
class Demo

  def hello1
    p "Hello from first definition"
  end

  # ...lots of code here...
  # and you forget that you have already defined hello1

  def hello1
    p "Hello from second definition"
  end

end
Demo.new.hello1

চালান:

$ ruby demo.rb
=> "Hello from second definition"

তবে সক্ষম হওয়া সতর্কতা সহ এটি কল করুন এবং আপনি কারণটি দেখতে পারেন:

$ ruby -w demo.rb
demo.rb:10: warning: method redefined; discarding old hello1
=> "Hello from second definition"

আমি যদি 100 পারতাম তবে সতর্কতা ব্যবহার করতে পারতাম।
অ্যান্ড্রু গ্রিম

3

আমি মনে করি বিষয়গুলিতে দৈর্ঘ্যটি ব্যবহার করা সবসময় ভাল ... কারণ আকার প্রায় সবকিছুর দ্বারা সমর্থিত হয় এবং রুবির ডায়নামিক ধরণের থাকে আপনি সত্যই অদ্ভুত ফলাফল কল করতে পারেন। যখন আপনার ভুল টাইপ থাকে তখন সাইজ করুন ... আমি বরং আরও পেতে চাই একটি NoMethodError: অপরিবর্তিত পদ্ধতি `দৈর্ঘ্য ', তাই আমি সাধারণত রুবির বস্তুগুলিতে কখনও আকারকে কল করি না।

আমাকে একাধিকবার বিট করুন

এছাড়াও মনে রাখবেন যে বস্তুর আইড রয়েছে, তাই আমি বিভ্রান্তি এড়াতে ভেরিয়েবল কল আইডি বা অবজেক্ট_আইডি ব্যবহার না করার চেষ্টা করি। যদি কোন ব্যবহারকারীদের আইডিতে আমার আইডি প্রয়োজন হয় তবে এটিকে ইউজার_আইডি জাতীয় কিছু বলা ভাল।

শুধু আমার দুই সেন্ট


2

আমি রুবিতে নতুন, এবং আমার প্রথম দফায় আমি একটি পূর্ণসংখ্যার ফ্লোট / স্ট্রিং পরিবর্তন সম্পর্কিত একটি সমস্যা হিট করেছি। আমি ভাসমানগুলি দিয়ে শুরু করেছি এবং f.to_int হিসাবে সবকিছুকে কোড করেছি । কিন্তু যখন আমি চালিয়ে যেতে এবং স্ট্রিংগুলির জন্য একই পদ্ধতিটি ব্যবহার করি তখন প্রোগ্রামটি চালানোর সময় আমার একটি বক্ররেখা নিক্ষেপ করা হয়েছিল।

স্পষ্টতই একটি স্ট্রিংয়ে একটি টু-সিন্ট পদ্ধতি নেই, তবে ভাসমান এবং ইনটস থাকে।

irb(main):003:0* str_val = '5.0'
=> "5.0"
irb(main):006:0> str_val.to_int
NoMethodError: undefined method `to_int' for "5.0":String
        from (irb):6
irb(main):005:0* str_val.to_i
=> 5


irb(main):007:0> float_val = 5.0
=> 5.0
irb(main):008:0> float_val.to_int
=> 5
irb(main):009:0> float_val.to_i
=> 5
irb(main):010:0>

নির্বিচারে প্রথম বন্ধনী আমাকে প্রথমে ছুড়ে ফেলেছিল। আমি কিছু কোড সহ এবং কিছু ছাড়াও দেখেছি। উভয় শৈলী গ্রহণ করা হয়েছে তা বুঝতে আমার কিছুটা সময় লেগেছে।


2

সন্ন্যাসীর প্রতিক্রিয়া সম্পর্কিত, রুবির to_fooপদ্ধতিগুলি কীভাবে কঠোর রূপান্তরটি করবে তা ইঙ্গিত দেয়।

সংক্ষিপ্ত বেশী পছন্দ to_i, to_sএটা বলতে অলস হতে এবং তাদের লক্ষ্য টাইপ এমনকি যদি তারা যে বিন্যাসে সঠিকভাবে প্রতিনিধিত্ব করা সক্ষম না হন রূপান্তর করুন। উদাহরণ স্বরূপ:

"10".to_i == 10
:foo.to_s == "foo"

আর সুস্পষ্ট ফাংশনগুলির মতো to_int, এর to_sঅর্থ হ'ল অবজেক্টটি সেই জাতীয় ডেটা হিসাবে স্থানীয়ভাবে উপস্থাপিত হতে পারে। উদাহরণস্বরূপ, Rationalবর্গটি সমস্ত যুক্তিযুক্ত সংখ্যা উপস্থাপন করে, তাই এটি কল করে সরাসরি ফিক্সনাম (বা বিগনাম) পূর্ণসংখ্যা হিসাবে উপস্থাপন করা যায় to_int

Rational(20,4).to_int == 5

যদি আপনি আর লম্বা পদ্ধতিটি কল করতে না পারেন তবে এর অর্থ that বস্তুটি সেই জাতীয়ভাবে স্থানীয়ভাবে উপস্থাপন করা যায় না।

সুতরাং মূলত, রূপান্তরকালে, আপনি যদি পদ্ধতির নামগুলি নিয়ে অলস হন তবে রূপান্তরটি নিয়ে রুবি অলস হয়ে উঠবে।


1
"আলস্য" এখানে কি সঠিক শব্দ?
অ্যান্ড্রু গ্রিম


1

রুবি হ্যাশগুলির মাধ্যমে আইট্রেটেশন কোনও নির্দিষ্ট ক্রমে হওয়ার গ্যারান্টিযুক্ত নয়। (এটি কোনও বাগ নয়, এটি একটি বৈশিষ্ট্য)

Hash#sort আপনার যদি একটি নির্দিষ্ট অর্ডার প্রয়োজন হয় দরকারী is

সম্পর্কিত প্রশ্ন: কেন রুবির 1000 টি হ্যাশের কী এবং মান জোড়া সর্বদা নির্দিষ্ট ক্রমে থাকে?


4
এটি 1.9 হিসাবে বৈধ নয়: "রুবি ১.৯-তে, তবে হ্যাশ উপাদানগুলি তাদের সন্নিবেশ ক্রমে পুনরায় প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে
পুনরুক্ত করা হয়

0

এই আমাকে একবার পাগল করেছে:

1/2 == 0.5 #=> false
1/2 == 0   #=> true

আমি বিশ্বাস করি এটি জাভা, সি এবং সি ++-তে ঠিক একইভাবে আচরণ করবে।
ল্যারি

এটি মজার, আমি এটি সম্পর্কে ভাবিও নি, তবে আপনি যদি খোলার চেষ্টা করেন এবং এটি চেষ্টা করেন, তা বোঝা যায়: সুতরাং (১/২) একটি ফিক্সনাম এবং (০.৫) একটি ভাসা। এবং আমরা জানি যে ফিক্সনিম! = ভাসা।
DemitryT

2
@ ডিমিট্রিটি আমি মনে করি যে সহজ কারণ হ'ল ধরণের নির্বিশেষে 1/2মূল্যায়ন করে 0, যা সমান হয় না 0.5। তবে, Rational(1, 2) == 0.5এবং 1.0 == 1
সর্বাধিক ন্যানসি

সর্বজনীন ভাষার হিচাপ এখানে। এটি রুবি এবং নতুন প্রোগ্রামিংয়ের জন্য নতুন কিছু জানা উচিত।
dtc

0
1..5.each {|x| puts x}

কাজ করে না আপনার পছন্দসই বিষয়টিকে প্যারেন্টেসিসে রাখতে হবে

(1..5).each {|x| puts x}

সুতরাং আপনি কল করছেন বলে মনে হয় না 5.each। আমি মনে করি এটি x = true and falseগোটার মতোই একটি অগ্রাধিকার বিষয় is


পরিবর্তে আমি এটি বন্ধনী বলব। দ্বিতীয়ত, কোনও কোড যদি রিটার্ন মান / অগ্রাধিকার ইস্যু বলে মনে হয় তবে তা কোনওভাবেই বন্ধনী দ্বারা ঘিরে রাখা উচিত। সুতরাং, আমার কাছে, এই "গোটচা" তে বিশেষ কিছুই নেই। আপনি প্রতিটি সংযুক্ত "গোটচাস" লিখে রাখতে পারেন, যদিও এটি সময় নষ্ট হবে। স্পষ্টত সাথী, এমনকি যদি আপনার এটির প্রত্যাশিত ফলাফল পাওয়া যায়, তবে আমি এখনও বন্ধনীগুলির সাথে ঘিরেই পছন্দ করব।
üzgür
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.