রুবি অ্যারের ব্যতীত শেষ উপাদান


139

ধরা যাক আমার কাছে রুবি অ্যারে রয়েছে

a = [1, 2, 3, 4]

আমি যদি প্রথম আইটেম বাদে সবই চাই, আমি লিখতে পারি a.drop(1), যা দুর্দান্ত। আমি যদি সর্বশেষ আইটেম বাদে সমস্ত চাই , তবে আমি কেবল এইভাবেই ভাবতে পারি

a[0..-2]   # or
a[0...-1]

তবে এগুলির উভয়ই ব্যবহারের মতো পরিষ্কার দেখাচ্ছে না drop। অন্য কোনও অন্তর্নির্মিত উপায়ে আমি মিস করছি?


গ্লোবালনার্ডি.২০০৮/০/10/১০ / ২০১৮ অনুসারে , ড্রপটি রুবি ১.৮. rather এর পরিবর্তে রুবি ১.৯ হয়
অ্যান্ড্রু গ্রিম

পারফরম্যান্স সম্পর্কে কী .. যদি আমি এই উত্তরগুলি বারবার বারবার পুনরাবৃত্তিতে ব্যবহার করি .. তবে কোনটি জিতবে?
নিনাদ

অন্য কথায়, কোন সমাধানটি হুডের নীচে অ্যারেটিকে অতিক্রম করে না?
নিনাদ

অন্য কোনও উপায়ে, ক - ([a.size])
জন

উত্তর:


128

সম্ভবত ...

a = t               # => [1, 2, 3, 4]
a.first a.size - 1  # => [1, 2, 3]

অথবা

a.take 3

অথবা

a.first 3

অথবা

a.pop

যা সর্বশেষে ফিরে আসবে এবং এর আগে সমস্ত কিছু দিয়ে অ্যারে ছেড়ে দেবে

বা তার রাতের খাবারের জন্য কম্পিউটারকে কাজ করুন:

a.reverse.drop(1).reverse

অথবা

class Array
  def clip n=1
    take size - n
  end
end
a          # => [1, 2, 3, 4]
a.clip     # => [1, 2, 3]
a = a + a  # => [1, 2, 3, 4, 1, 2, 3, 4]
a.clip 2   # => [1, 2, 3, 4, 1, 2]

5
একটি পদ্ধতি যুক্ত Arrayকরা আমার কাছে সেরা পদ্ধতির মতো বলে মনে হচ্ছে। বেশিরভাগ প্রকল্পগুলির core_ext.rbমতো অল্প এক্সটেনশান সহ একটি ফাইল শেষ হয় । কিছু লাইব্রেরি ব্যবহারিকভাবে সমস্ত এক্সটেনশন যেমন: ActiveSupportউদাহরণস্বরূপ।
rfunduk

এটি আকর্ষণীয়, আমি ভাবছি যে এটি কত সাধারণ। মানুষ কবিতা মোড সম্পর্কে কি মনে করেন?
ডিজিটালরোস

5
কেউ এই clipপদ্ধতিটি রুবি সম্প্রদায়ের কাছে কীভাবে জমা দেয় ? আমি সত্যিই মনে হয় এই সেখানে হওয়া উচিত, এবং বানর-প্যাচিং হয় ভুল জিনিস
Droogans

7
আমি a.reverse.drop(1).reverseকৌশল পছন্দ করি । ;-)
অ্যালেক্স

92

কৌতূহলের বাইরে, কেন আপনি পছন্দ করেন না a[0...-1]? আপনি অ্যারের একটি স্লাইস পেতে চান, তাই স্লাইস অপারেটরটিকে মূio় পছন্দ হিসাবে মনে হচ্ছে।

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

class Array
    def drop_last
        self[0...-1]
    end
end

মনে হচ্ছে প্রচুর গোলমাল, যখন ড্রপ খুব পরিষ্কার থাকে। এটি কোনও বড় বিষয় নয়, তবে একটি সংক্ষিপ্ত নজরে নিশ্চিত হওয়া শক্ত যে এটি ঠিক। আমি যাইহোক, আপনার নামটিকেই পছন্দ করি drop_last...
পিটার

আমি .1 দৈর্ঘ্যের ব্যবহারের চেয়ে আরও মার্জিত -1 ব্যবহার করতে পছন্দ করি
উইল নাথান

কৌতুহল, তৃতীয়টির অর্থ কী .?
জোশুয়া পিন্টার

5
... মানে শেষ আইটেমটি অন্তর্ভুক্ত নয়, -1 হ'ল সর্বশেষ আইটেম। আপনি যদি দুটি বিন্দু করেন তবে এটিতে সর্বশেষ আইটেম, তিনটি বিন্দু অন্তর্ভুক্ত থাকবে তবে এতে শেষ আইটেমটি অন্তর্ভুক্ত হবে না।
ckim

অ্যারের লেজ পেতে স্লাইস অপারেটরটি ব্যবহারে সতর্কতা অবলম্বন করুন: এটি ফিরে আসতে পারে nil: [][1..-1]-> nil, [][0...-1]->[]
মাইকেল

57

আর একটি দুর্দান্ত কৌশল

>> *a, b = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2]
>> b
=> 3

ভাল লাগল, রুবীর এই ছিল জানা ছিল না; সুতরাং a, *b = [1,2,3]আসুন আমরা ক্লাসিক গাড়ি / সিডিআর ফ্যাশনে অ্যারেটি দেখি।
নোবনিবব লিটলুন

সত্য, আমি মন্তব্যটি মনে করি না: ডি এটি এখন মুছে
ফেলেছে

খুব সহজ এবং সুন্দর। THX
মাইক্রোস্পিনো

43

আপনি যদি pop()অ্যারেতে কোনও অপারেশন করতে চান (যা শেষ আইটেমটি মুছে ফেলার ফলস্বরূপ হয়) তবে আপনি পপড উপাদানগুলির পরিবর্তে অ্যারেটি পেতে আগ্রহী হন, আপনি ব্যবহার করতে পারেন tap(&:pop):

> arr = [1, 2, 3, 4, 5]
> arr.pop
=> 5
> arr
=> [1, 2, 3, 4]
> arr.tap(&:pop)
=> [1, 2, 3]

এই উত্তরটি হ'ল এই ব্যবহারকারীকে শব্দার্থগতভাবে সবচেয়ে বেশি বোঝায় sense মিরর অপারেশনগুলি হাতে রয়েছে এবং এটি এমন শব্দ ব্যবহার করে যা ব্যাখ্যা করা সহজ & সংক্ষিপ্ত করে।
জেরোম

2
এটি কিছু চতুর রুবি।
ফাঁকাওয়ালা

38

আমি এটি এইভাবে করি:

my_array[0..-2]

2
এটি চমত্কারভাবে কাজ করে। অনেক গুলো জটিল উত্তর কেন আছে তা নিয়ে আমি বিভ্রান্ত। এটি কি নতুন রুবি সংযোজন?
জোশুয়া পিন্টার

@ জোশুয়া পিন্টার এটি শুরু থেকেই আছে । আমি একমত যে এটি এখন পর্যন্ত সর্বোত্তম পদ্ধতির।
জুলিয়ান

23

ড্রপ পদ্ধতি নিজেই বাড়ানো সম্পর্কে, উদাহরণস্বরূপ?

class Array
  def drop(n)
    n < 0 ? self[0...n] : super
  end
end

তারপরে আপনি প্রান্ত থেকে উপাদানগুলি সরাতে নেতিবাচক আকার ব্যবহার করতে পারেন:

[1, 2, 3, 4].drop(-1) #=> [1, 2, 3]
[1, 2, 3, 4].drop(-2) #=> [1, 2]

19

a[0...-1]সেরা উপায় মত মনে হচ্ছে। অ্যারে স্লাইসিং সিনট্যাক্সটি ঠিক এই উদ্দেশ্যে তৈরি করা হয়েছিল ...

বিকল্পভাবে, যদি আপনি জায়গায় অ্যারে পরিবর্তন করতে কিছু মনে করেন না, আপনি কেবল কল করতে পারেন a.pop:

>> a = [1, 2, 3, 4]
>> a.pop
>> a
=> [1, 2, 3]

পরে ব্যবহারের জন্য আপনি কোনও ভেরিয়েবলের জন্য শেষ উপাদানটিও বরাদ্দ করতে পারেন:b = a.pop
ভিক্টর ফোনিক

12

বাকি উপাদানগুলির সাথে এক লাইনে শেষ উপাদানটি থেকে মুক্তি পেতে rid

[1, 2, 4, 5, 6].reverse.drop(1).reverse

গুরুতরভাবে যদিও,

[1,2,3,4][0..-2]
#=> [1,2,3]

11

এটাই উপাই:

[1,2,3,4,5][0..-1-1]

তবে আসুন কীভাবে এটি কাজ করে তা ব্যাখ্যা করি:

a = [1,2,3,4,5]

পরবর্তী উদাহরণ 0 অবস্থান থেকে শেষ অবধি সমস্ত রেকর্ড ফিরিয়ে দেবে

a[0..-1]
=> [1, 2, 3, 4, 5]

পরবর্তী উদাহরণটি 1 অবস্থান থেকে শেষ পর্যন্ত রেকর্ডগুলি ফিরিয়ে দেবে

a[1..-1]
=> [2, 3, 4, 5]

এবং এখানে আপনার যা প্রয়োজন তা আছে। পরবর্তী উদাহরণটি 0 অবস্থান থেকে শেষ -1 এ রেকর্ডগুলি ফিরিয়ে দেবে

a[0..-1-1]
=> [1, 2, 3, 4]

1
আপনি লিখতে পারেন -2পরিবর্তে -1-1
bfontaine

আপনি করতে পারেন a[0...-1](তৃতীয় বিন্দুটি লক্ষ্য করুন) এবং একই ফলাফল পাবেন a[0..-1-1]কারণ তৃতীয় বিন্দু শেষ উপাদানটিকে বাদ দিতে বলেছে। দেখুন এই আরো বিস্তারিত জানার জন্য।
জুলিয়ান

7

আপনি কি "নিতে" চেষ্টা করেছেন

a.take(3) 

6
সাধারণভাবে, এটি হয় a.take(a.size - 1); হ্যাঁ, আমি এই বিকল্পটি বিবেচনা করেছি।
পিটার

2

উত্তর: a.τwτ তবে আপনাকে প্রথমে পাইপার ইনস্টল করতে হবে ...

পাইপারের ভূমিকা: আপনি কি লিস্পি carএবং অ্যারেটির cdr"প্রথম" এবং "বিশ্রাম "টি ফিরে আসবেন জানেন ? কেবল আপনার মতো প্রয়োজনের জন্য, আমি এই লিসি প্রক্রিয়াটির একটি এক্সটেনশন করেছি। এটি বলা হয়ে থাকে pyperএবং এটি আপনাকে ২ য়, ২ য়, ৩ য় থেকে বিশ্রাম, ৩ য় থেকে বিশ্রাম এবং শেষ পর্যন্ত সমস্ত কিছু অ্যাক্সেস করতে দেয় যা এগুলি সম্পর্কে লেখার মতো বেশি নয়, তবে এটি অক্ষরের রচনাকেও অনুমতি দেয়, ঠিক যেমন caar, cadr, cdadarইত্যাদি পাতার মর্মর থেকে জানা:

# First, gem install pyper
require 'pyper'
include Pyper
a = %w/lorem ipsum dolor sit amet/
# To avoid confusion with other methods, and also because it resembles a rain gutter,
# Greek letter τ is used to delimit Pyper methods:
aaτ #=> "lorem"
adτ #=> ["ipsum", "dolor", "sit", "amet"]
abτ #=> "ipsum"
aeτ #=> ["dolor", "sit", "amet"]
acτ #=> "dolor" (3rd)
azτ #=> "amet" (last)
ayτ #=> "sit" (2nd from the end)
axτ #=> "dolor" (3rd from the end)

এবং অবশেষে, আপনার প্রশ্নের উত্তর:

awτ #=> ["lorem", "ipsum", "dolor", "sit"] (all except last)

আরও আছে:

auτ #=> ["lorem", "ipsum", "dolor"] (all except last 2)
a1τ #=> ["lorem", "ipsum"] (first 2)
a8τ #=> (last 2)
a7τ #=> (last 3)

রচনা:

awydτ #=> "olor" (all except 1st letter of the last word of all-except-last array)

এছাড়া মাত্র চেয়ে বেশি কমান্ড অক্ষর a..f, u..zএবং 0..9, এর মধ্যে উল্লেখযোগ্য হল m, মানচিত্র, যার অর্থ:

awmbτ #=> ["o", "p", "o", "i"] (second letters of all-except-last array)

তবে অন্যান্য কমান্ডের অক্ষরগুলি খুব গরম এবং এই মুহূর্তে ব্যবহার করা খুব সহজ নয়।


1
আমি এপ্রিল 1 এ পড়ছি তাই আমি ধরে নিলাম এটি একটি রসিকতা ... নাহ। রুবির পক্ষে এই জিনিসটির অস্তিত্ব সম্পর্কে কোনও ধারণা ছিল না। :)
জোশুয়া পিন্টার

1

এটি আসলটির শেষ উপাদানগুলি ছাড়া সমস্ত সহ একটি নতুন অ্যারে তৈরি করে:

ary2 = ary.dup
ary2.pop

মনে রাখবেন যে আরও কয়েক জন # পপ ব্যবহারের পরামর্শ দিয়েছেন। আপনি যদি ঠিক জায়গায় অ্যারে পরিবর্তন করে থাকেন তবে তা ঠিক আছে। আপনি যদি এটির সাথে ঠিক না থাকেন তবে এই উদাহরণ হিসাবে প্রথমে অ্যারেটি ধুয়ে নিন।


1
যদি আপনি ঠিক জায়গায় জায়গায় অ্যারে সংশোধন করে থাকেন তবে আরও কয়েকজন # পপ ব্যবহারের পরামর্শ দিয়েছেন। আপনি যদি এটির সাথে ঠিক না থাকেন তবে এই উদাহরণ হিসাবে প্রথমে অ্যারেটি ধুয়ে নিন।
alegscogs

এটি একটি গুরুত্বপূর্ণ মন্তব্য। আপনি এটি কেবল আপনার উত্তরে যুক্ত করতে পারেন। যেহেতু # পপটিতে কোনও ঠাঁই নেই (!), এটি আসল অ্যারেটি সংশোধন করে এমন লোকেরা এড়াতে পারে।
mjnissim

অ্যারে বড় হলে এই উপায়টি অক্ষম।
জুলিয়ানগনজালেজ

1

আমি প্রায়শই নিজেকে একটি অ্যারের শেষ এন উপাদানগুলি ব্যতীত সবগুলি পেতে চাই। আমি অন্যভাবে সমাধানের চেয়ে আরও পঠনযোগ্য মনে করি এমনভাবে এটি করার জন্য আমার নিজের ফাংশনটি কারচুপি করেছি:

class Array
  def all_but_the_last(n)
    self.first(self.size - n)
  end
end

এখন আপনি নিম্নলিখিতটি করতে পারেন:

arr = ["One", "Two", "Three", "Four", "Five"]
# => ["One", "Two", "Three", "Four", "Five"]

arr.all_but_the_last(1)
# => ["One", "Two", "Three", "Four"]

arr.all_but_the_last(3)
# => ["One", "Two"]

arr.all_but_the_last(5)
# => []

arr.all_but_the_last(6)
# ArgumentError: negative array size

আমি ইচ্ছাকৃতভাবে আরগমেন্টআরারের জন্য অনুমতি দিয়েছি যাতে কলাররা এই পদ্ধতিটি কীভাবে ব্যবহার করেন তার জন্য দায়বদ্ধ। আমি এই পদ্ধতির মন্তব্য / সমালোচনা শুনতে পছন্দ করব।


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