একটি পদ্ধতি থেকে দুটি এবং আরও মান প্রদান করুন


105

পদ্ধতি থেকে একাধিক মান প্রত্যাবর্তনের কি কোনও সম্ভাবনা আছে? এটার মতো কিছু:

def someMethod()
  return ["a", 10, SomeObject.new]
end

[a, b, c] = someMethod

উত্তর:


160
def sumdiff(x, y)
  return x+y, x-y
end
#=> nil

sumdiff(3, 4)
#=> [7, -1]

a = sumdiff(3,4)
#=> [7, -1]
a
#=> [7, -1]

a,b=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1

a,b,c=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1
c
#=> nil

আপনার কোড বিন্যাস ব্যবহার করা উচিত, পাঠ্য বিন্যাস নয়। ইনডেন্ট লাইনগুলি চারটি স্পেস এবং আইআরবির >>প্রম্পট দ্বারা সৃষ্ট অদ্ভুততা দূর হয়ে যাবে।
ক্রিস লুটজ 15

4
যেহেতু একটি সুস্পষ্ট রিটার্নকে অ-পরিচয়যুক্ত রুবি হিসাবে বিবেচনা করা হয়, আপনিও প্রত্যাবর্তন মানগুলি একটি তালিকাতে স্পষ্ট করে রেখে ব্যবহার করতে পারেন:def foo_and_bar; ['foo', 'bar']; end
ডেনিস

43

রুবির ডেস্ট্রাকচারিং বাইন্ডের সীমিত আকার রয়েছে:

ary = [1, 2, 3, 4]
a, b, c = ary
p a # => 1
p b # => 2
p c # => 3

a, b, *c = ary
p c # => [3, 4]

a, b, c, d, e = ary
p d # => 4
p e # => nil

এটির কাঠামোর বাঁধনের একটি সীমিত রূপ রয়েছে:

 a = 1, 2, 3
 p a # => [1, 2, 3]

আপনি এই দুটি ফর্ম একত্রিত করতে পারেন:

a, b = b, a # Nice way to swap two variables

a, b = 1, 2, 3
p b # => 2

def foo; return 1, 2 end
a, b = foo
p a # => 1
p b # => 2

ডেস্ট্রাকচারিং / স্ট্রাকচারিং বাইন্ডের সাথে আপনি করতে পারেন এমন আরও বেশ কয়েকটি জিনিস রয়েছে। আমি *ডানদিকে স্প্ল্যাট অপারেটর ( ) ব্যবহার করে দেখায় নি । আমি বাসা বাঁধে না (প্যারান্থেস ব্যবহার করে)। আমি দেখিনি যে আপনি কোনও ব্লক বা পদ্ধতির প্যারামিটার তালিকায় ডেস্ট্রাকচারিং বাইন্ড ব্যবহার করতে পারেন।

এখানে কেবল একটি ক্ষুধা দেওয়া হয়েছে:

def foo(((a, b, c, d), e, *f), g, *h)
  local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end
end

foo([[1, 2, 3], 4, 5, 6], 7, 8, 9)
# a => 1
# b => 2
# c => 3
# d => nil
# e => 4
# f => [5, 6]
# g => 7
# h => [8, 9]

16

একাধিক মান ফিরিয়ে দেওয়া প্রায়শই দরকারী, আমি সাধারণত এটি একটি নতুন বস্তুর প্রয়োজনীয়তার জন্য একটি পয়েন্টার পাই।

এটি হ'ল, আমি সাধারণত দেখতে পাই যে those প্রত্যাবর্তনের মানগুলি অর্থ / প্রসঙ্গে একত্রে আবদ্ধ এবং এরূপ হিসাবে পাস করা হয়েছে। সুতরাং এই ক্ষেত্রে আমি এগুলিকে এক সাথে বেঁধে রাখতে একটি নতুন অবজেক্ট তৈরি করব। এটি একটি নির্দিষ্ট কোড গন্ধ যা আমি চিনতে শিখেছি।


4
আরও স্বাধীনতা, আরও দায়িত্ব। অভিজ্ঞ রুবিবাদী এর সুবিধা নেবে এবং কিছু সুন্দর কোড লিখত। রুবি রোকস জিনিসগুলি আরও খারাপ করতে পারে।
fengd

1
স্পষ্টভাবে পরিষ্কার যে এটি সবসময় হয় না, অন্যথায় জিনিসগুলির chunkঅস্তিত্ব থাকত না। যদিও দুর্দান্ত নীতি। কোড গন্ধ প্রকৃতপক্ষে। মন মাতান.
দার্ট এগ্রিগিয়াস

6

আপনি যেমন একটি অ্যারেও ফেরত অর্জন করতে পারেন

def sumdiff(x, y)
    [x+y, x-y]
end

যা কার্যত সমান বলে মনে হয়

def sumdiff(x, y)
    return x+y, x-y
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.