কোনও নতুন স্ট্রিং তৈরি না করে রুবিতে স্ট্রিং ছাঁটাই করার সাধারণ উপায় কী?


182

এটি এখন আমার কাছে রয়েছে - যা এটি করছে তার জন্য ভারবস মনে হচ্ছে।

@title        = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?

ধরুন টোকেনগুলি একটি সিএসভি লাইনের বিভাজন দ্বারা প্রাপ্ত একটি অ্যারে। এখন ফালা মত ফাংশন! chomp! এবং। স্ট্রিংটি পরিবর্তন না করা হলে সমস্ত রিটার্ন শূন্য হয়

"abc".strip!    # => nil
" abc ".strip!  # => "abc"

অনুলিপি তৈরি না করে অতিরিক্ত নেতৃস্থানীয় বা চলমান স্থান থাকলে রুবিকে এটি ছাঁটাই করার উপায় কী?

আমি করতে চাইলে কৃপণতা পায় tokens[Title].chomp!.strip!


3
আপনি যদি বারবার টোকেনের বাইরে জিনিসগুলি পড়তে চলেছেন তবে এটির প্রাক-প্রক্রিয়াটি আরও বোধগম্য হতে পারে। অর্থাৎ, "টোকেনস.ইচ {| টি | টিস্ট্রিপ!}"। তারপর আপনি শুধু করতে পারি না "@title = টোকেন [TITLE] || ''"
গ্লেন McDonald

উত্তর:


272

আমার ধারণা আপনি যা চান তা হ'ল:

@title = tokens[Title]
@title.strip!

#strip!পদ্ধতি ফিরে আসবে nilযদি এটা কিছু স্ট্রিপ নি, এবং পরিবর্তনশীল নিজেই যদি তা ছিনতাই হয়ে গেছে।

রুবি স্ট্যান্ডার্ড অনুযায়ী, বিস্মৃত চিহ্নের সাথে সংযুক্ত একটি পদ্ধতি জায়গায় পরিবর্তনশীল পরিবর্তন করে।

আশাকরি এটা সাহায্য করবে.

আপডেট: এটি irbপ্রদর্শন থেকে আউটপুট :

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"

1
হুম .. তবুও আমি @ টাইটেল = টোকেন [শিরোনাম]। স্ট্রিপ! দেখতে আরও ক্লিয়ার - এটি একটি করুণাঙ্কিত যা এটি অবিস্রষ্ট স্ট্রিংয়ের পরিবর্তে শূন্য করে। যদি না কেউ আরও ভাল উত্তর পোস্ট করেন তবে আপনি গ্রহণযোগ্য কিছু পেয়ে যাচ্ছেন।
গিশু

7
ঠিক আছে, @ শিরোনাম = টোকেন [শিরোনাম]। স্ট্রিপটি কৌশলটি সম্পাদন করবে তবে তার পরিবর্তে আপনার একটি অনুলিপি থাকবে, আপনি যদি টোকেনগুলি [শিরোনাম] ভেরিয়েবলটি অপরিবর্তিত রাখেন তবে তা ঠিক।
ইগোর

9
রুবি ১.৯ এর ট্যাপ রয়েছে, যা আপনি যা চান ঠিক তা করে: @ শিরোনাম.ট্যাপ ap | এক্স | x.strip!}
টিমকেে

2
@timkay এটা কি সম্ভব হবে @title.tap &:strip!? এটি অন্য যে কোনও কিছুর চেয়ে পরিষ্কার মনে হয়।
জন এজেল্যান্ড

16
পৃথিবীতে কেন nilএটি কিছু ফেরা না করে ফিরে আসবে ? এতে সন্দেহ নেই যে তারা প্রচুর লোককে বিভ্রান্ত করেছে (যেহেতু এটি কোনও অর্থ দেয় না)।
জোশ এম।

53

বিটিডব্লিউ, এখন রুবি ইতিমধ্যে "!" ছাড়াই কেবল স্ট্রিপ সমর্থন করে।

তুলনা করা:

p "abc".strip! == " abc ".strip!  # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip    # true

stripনকল ছাড়া এটি অসম্ভব । স্ট্রিং.কমের উত্স দেখুন:

static VALUE
rb_str_strip(VALUE str)
{
    str = rb_str_dup(str);
    rb_str_strip_bang(str);
    return str;
}

রুবি 1.9.3p0 (2011-10-30) [i386-mingw32]

আপডেট 1: আমি এখন দেখতে পাচ্ছি - এটি 1999 সালে তৈরি হয়েছিল ( এসভিএন-এ Rev # 372 দেখুন ):

আপডেট 2: strip!সদৃশ তৈরি করবে না - উভয়ই 1.9.x, 2.x এবং ট্রাঙ্ক সংস্করণে।


1
"ডুপ্লিকেট ছাড়াই ছিটানো অসম্ভব" - অবশ্যই এটি সম্ভব, strip!এটিই এর জন্য।
করলি হরভাথ

@ করোলি হোরভাথ 'আপনি সিটিতে লিখিত উত্স কোডটি দেখতে পাচ্ছেন না? Pls মনোযোগ সহকারে পড়ুন, আমি এখানে নকল সম্পর্কে কি লিখেছি।
গ্যারেক্স

1
অবশ্যই আমি এটি দেখতে। তবে এটির উত্স কোড strip। আমি কি কিছু ভুল বুঝি? "ডুপ্লিকেট ছাড়া স্ট্রিপিংয়ের পক্ষে অসম্ভব" কীভাবে আমি ব্যাখ্যা করব?
করলি হরভাথ

@ কারলিহর্বাথ অভ্যন্তরীণভাবে সদৃশ সর্বদা তৈরি করা হয়। এটি স্ট্রিং সম্পর্কে `str = rb_str_dup (str);`
গেআরেক্স

1
এবং আপনি যদি সদৃশটি না চান তবে আপনি strip!ওরফে ব্যবহার করুন rb_str_strip_bang
করলি হরভাথ

9

স্ট্রিপ এবং চম্প উভয়েরই দরকার নেই কারণ স্ট্রিপও ট্র্যাজিং ক্যারেজ রিটার্ন সরিয়ে ফেলবে - যদি না আপনি ডিফল্ট রেকর্ড বিভাজকটি পরিবর্তন করেন এবং এটিই আপনি চিপ করছেন।

অলির উত্তরটি ইতিমধ্যে রুবিতে এটি করার প্রচলিত পদ্ধতি রয়েছে, যদিও আপনি নিজেকে এটি অনেক কিছু করতে দেখেন তবে আপনি সর্বদা এর জন্য কোনও পদ্ধতি সংজ্ঞায়িত করতে পারেন:

def strip_or_self!(str)
  str.strip! || str
end

প্রদান:

@title = strip_or_self!(tokens[Title]) if tokens[Title]

এছাড়াও মনে রাখবেন যে যদি @titleটোকেনটি নিল হয় তবে যদি বিবৃতিটি নির্ধারিত হতে বাধা দেয় তবে এর ফলাফলটি এর পূর্ববর্তী মানটি রাখে। আপনি যদি চান বা @titleসর্বদা নিয়োগের বিষয়ে আপত্তি না করেন তবে আপনি চেকটি পদ্ধতিতে স্থানান্তর করতে পারেন এবং আরও সদৃশতা হ্রাস করতে পারেন:

def strip_or_self!(str)
  str.strip! || str if str
end

বিকল্প হিসাবে, আপনি যদি দুঃসাহসী বোধ করেন তবে আপনি স্ট্রিংয়ের উপর একটি পদ্ধতি নির্ধারণ করতে পারেন:

class String
  def strip_or_self!
    strip! || self
  end
end

এর মধ্যে একটি দেওয়া:

@title = tokens[Title].strip_or_self! if tokens[Title]

@title = tokens[Title] && tokens[Title].strip_or_self!

9

আপনি যদি রুবেল অন রেল ব্যবহার করেন তবে সেখানে স্কোয়াশ রয়েছে

> @title = " abc "
 => " abc " 

> @title.squish
 => "abc"
> @title
 => " abc "

> @title.squish!
 => "abc"
> @title
 => "abc" 

আপনি যদি শুধু রুবি ব্যবহার করেন তবে আপনি স্ট্রিপটি ব্যবহার করতে চান

এর মধ্যেই গোটাচা রয়েছে .. আপনার ক্ষেত্রে আপনি স্ট্র্যাপটি ব্যাং ছাড়াই ব্যবহার করতে চান!

ফালা যখন! অবশ্যই কোনও পদক্ষেপ নেই যদি এটি এখনও পরিবর্তনশীল তাই স্ট্রিপ আপডেট! ইনলাইন ব্যবহার করা যাবে না। আপনি যদি স্ট্রিপ ইনলাইন ব্যবহার করতে চান তবে ঠুং ঠুং শব্দ ছাড়া সংস্করণটি ব্যবহার করতে পারেন!

ফালা! মাল্টি লাইন পদ্ধতির ব্যবহার

> tokens["Title"] = " abc "
 => " abc "
> tokens["Title"].strip!
 => "abc"
> @title = tokens["Title"]
 => "abc"

একক লাইন পদ্ধতির স্ট্রিপ করুন ... আপনার উত্তর

> tokens["Title"] = " abc "
 => " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
 => "abc"

4

আমি মনে করি আপনার উদাহরণটি একটি বুদ্ধিমান পন্থা, যদিও আপনি এটিকে কিছুটা সহজ করতে পারবেন:

@title = tokens[Title].strip! || tokens[Title] if tokens[Title]

বিকল্প আপনি এটি দুটি লাইনে রাখতে পারেন:

@title = tokens[Title] || ''
@title.strip!

3

আপনার যদি এর মতো কিছু প্রয়োজন পরে অন্য কোনও পদ্ধতি ব্যবহার করতে চান:

( str.strip || str ).split(',')

এইভাবে আপনি স্ট্রিপ করতে পারেন এবং তারপরেও কিছু করতে পারেন :)



1

আপনার যদি হয় রুবি ১.৯ বা অ্যাক্টিভসপোর্ট, আপনি সহজভাবে করতে পারেন

@title = tokens[Title].try :tap, &:strip!

এই সত্যিই শীতল হয়, যেমন লিভারেজ :tryএবং :tapপদ্ধতি, যা আমার মতে রুবি সবচেয়ে শক্তিশালী কার্মিক নির্মান করে।

একটি এমনকি কিউটার ফর্ম, সম্পূর্ণরূপে প্রতীক হিসাবে ফাংশন পাস:

@title = tokens[Title].send :try, :tap, &:strip!

-1
@title = tokens[Title].strip! || tokens[Title]

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

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