මට වටිනාකමක් 'Dog'
සහ අරාවක් ['Cat', 'Dog', 'Bird']
තිබේ.
එය අරාව තුළ නොනවත්වා පවතින්නේ දැයි පරීක්ෂා කරන්නේ කෙසේද? වටිනාකම තිබේදැයි පරීක්ෂා කිරීමට සරල ක්රමයක් තිබේද, ඊට වඩා දෙයක් නැත?
මට වටිනාකමක් 'Dog'
සහ අරාවක් ['Cat', 'Dog', 'Bird']
තිබේ.
එය අරාව තුළ නොනවත්වා පවතින්නේ දැයි පරීක්ෂා කරන්නේ කෙසේද? වටිනාකම තිබේදැයි පරීක්ෂා කිරීමට සරල ක්රමයක් තිබේද, ඊට වඩා දෙයක් නැත?
Answers:
ඔබ සොයන්නේ include?
:
>> ['Cat', 'Dog', 'Bird'].include? 'Dog'
=> true
%w(Cat Dog Bird).include? 'Dog'
#include?
තවමත් ලූප ක්රියා කරන බව මම සටහන් කරමි . කෝඩරය පැහැදිලිවම ලූපය ලිවීමෙන් සුරකින ලදි. මම පිළිතුරක් එකතු කර ඇත්තෙමි.
එහි දී ය in?
ක්රමය තුළ ActiveSupport
@campaterson පෙන්වා දෙන පරිදි, v3.1 සිට (රේල් පීලි කොටසක්). එබැවින් රේල්ස් තුළ, හෝ ඔබට නම් require 'active_support'
, ඔබට ලිවිය හැකිය:
'Unicorn'.in?(['Cat', 'Dog', 'Bird']) # => false
OTOH, රුබී තුළම in
ක්රියාකරුවෙකු හෝ #in?
ක්රමවේදයක් නොමැත , එය මීට පෙර යෝජනා කර තිබුණද, විශේෂයෙන් යූසුකේ එන්ඩෝ විසින් රූබි- කෝර් හි ඉහළ පෙළේ සාමාජිකයෙකි.
වෙනත් අය විසින් උල් පිටතට ලෙස, ආපසු ක්රමය include?
සියලු පවතී, Enumerable
ඇතුළු හි Array
, Hash
, Set
, Range
:
['Cat', 'Dog', 'Bird'].include?('Unicorn') # => false
ඔබගේ අරාවෙහි ඔබට බොහෝ අගයන් තිබේ නම්, ඒවා සියල්ලම එකින් එක පරීක්ෂා කරනු ලැබේ (එනම් O(n)
), හෑෂ් සෙවීම නියත කාලය (එනම් O(1)
) වනු ඇති බව සලකන්න . එබැවින් ඔබ අරාව නියත නම්, උදාහරණයක් ලෙස, කට්ටලයක් භාවිතා කිරීම හොඳ අදහසකි . උදා:
require 'set'
ALLOWED_METHODS = Set[:to_s, :to_i, :upcase, :downcase
# etc
]
def foo(what)
raise "Not allowed" unless ALLOWED_METHODS.include?(what.to_sym)
bar.send(what)
end
ඒ ඉක්මන් පරීක්ෂණයක් ඉල්ලා අනාවරණය include?
10 අංගයක් මත Set
වේගවත් සමාන මත ඉල්ලා වඩා 3.5x පමණ වන Array
(එම මූලද්රව්යය සොයා ගැනීමට අපහසු නම්).
අවසාන අවසාන සටහන: include?
a භාවිතා කරන විට ප්රවේශම් Range
වන්න, සියුම්කම් ඇත, එබැවින් ලේඛනය වෙත යොමු කර සසඳන්න cover?
...
#in?
, ඔබ රේල්ස් භාවිතා කරන්නේ නම්, එය ලබා ගත හැකිය. api.rubyonrails.org/classes/Object.html#method-i-in-3F (මම දන්නවා මෙය රූබියක් මිස රේල්ස් ප්රශ්නයක් නොවන බව, නමුත් එය #in?
රේල්ස් වල භාවිතා කිරීමට බලාපොරොත්තු වන ඕනෑම කෙනෙකුට උදව් විය හැකිය . එය රේල්ස් වල එකතු කළ බවක් පෙනේ 3.1 apidock.com/rails/Object/in%3F
උත්සාහ කරන්න
['Cat', 'Dog', 'Bird'].include?('Dog')
භාවිතා කරන්න Enumerable#include
:
a = %w/Cat Dog Bird/
a.include? 'Dog'
නැතහොත්, පරීක්ෂණ ගණනාවක් සිදු කරන්නේ නම්, 1 ඔබට ලූපය ඉවත් කර ගත හැකිය (එය පවා include?
ඇත) සහ O (n) සිට O (1) වෙත යන්න:
h = Hash[[a, a].transpose]
h['Dog']
ඔබ වාරණ විසින් පරීක්ෂා කිරීමට අවශ්ය නම්, ඔබ උත්සාහ කල හැකි any?
හෝ all?
.
%w{ant bear cat}.any? {|word| word.length >= 3} #=> true
%w{ant bear cat}.any? {|word| word.length >= 4} #=> true
[ nil, true, 99 ].any? #=> true
බලන්න ගණ්ය වැඩි විස්තර සඳහා.
මගේ ආභාසය ලැබුනේ " අරාවෙහි කිසියම් අයිතමයක් තිබේදැයි තක්සේරු කරන්න "
රූබිට අරාවෙහි මූලද්රව්ය සොයා ගැනීමට ක්රම එකොළහක් ඇත.
කැමති එකක් include?
හෝ, නැවත නැවත පිවිසීම සඳහා, කට්ටලයක් සාදන්න, පසුව අමතන්න include?
හෝmember?
.
මෙන්න ඒවා සියල්ලම:
array.include?(element) # preferred method
array.member?(element)
array.to_set.include?(element)
array.to_set.member?(element)
array.index(element) > 0
array.find_index(element) > 0
array.index { |each| each == element } > 0
array.find_index { |each| each == element } > 0
array.any? { |each| each == element }
array.find { |each| each == element } != nil
array.detect { |each| each == element } != nil
ඔවුන් සියල්ලෝම ආපසු එති true
මූලද්රව්යය තිබේ නම් ඊෂ් අගයක් ලබා දෙයි.
include?
යනු වඩාත් කැමති ක්රමයයි. එය for
අභ්යන්තරව සී-භාෂා පුඩුවක් භාවිතා කරයි rb_equal_opt/rb_equal
. ඔබ නැවත නැවත සාමාජික චෙක්පත් සඳහා කට්ටලයක් සාදන්නේ නම් එය වඩාත් කාර්යක්ෂම කළ නොහැක.
VALUE
rb_ary_includes(VALUE ary, VALUE item)
{
long i;
VALUE e;
for (i=0; i<RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
switch (rb_equal_opt(e, item)) {
case Qundef:
if (rb_equal(e, item)) return Qtrue;
break;
case Qtrue:
return Qtrue;
}
}
return Qfalse;
}
member?
Array
පංතිය තුළ නැවත අර්ථ දක්වා නොමැති අතර Enumerable
සියලු අංග හරහා වචනාර්ථයෙන් ගණනය කරන මොඩියුලයෙන් භාවිතයට නොගත් ක්රියාත්මක කිරීමක් භාවිතා කරයි :
static VALUE
member_i(RB_BLOCK_CALL_FUNC_ARGLIST(iter, args))
{
struct MEMO *memo = MEMO_CAST(args);
if (rb_equal(rb_enum_values_pack(argc, argv), memo->v1)) {
MEMO_V2_SET(memo, Qtrue);
rb_iter_break();
}
return Qnil;
}
static VALUE
enum_member(VALUE obj, VALUE val)
{
struct MEMO *memo = MEMO_NEW(val, Qfalse, 0);
rb_block_call(obj, id_each, 0, 0, member_i, (VALUE)memo);
return memo->v2;
}
රූබි කේතයට පරිවර්තනය කර ඇති මෙය පහත සඳහන් දේ කරයි:
def member?(value)
memo = [value, false, 0]
each_with_object(memo) do |each, memo|
if each == memo[0]
memo[1] = true
break
end
memo[1]
end
අපේක්ෂිත අගයේ පළමු සිදුවීම සඳහා දෙකම අරාව සොයන බැවින් දෙකම include?
සහ member?
O (n) කාල සංකීර්ණතාවයක් ඇත.
මුලින් අරාවෙහි හැෂ් නිරූපණයක් සෑදීමේ වියදමින් O (1) ප්රවේශ වේලාව ලබා ගැනීමට අපට කට්ටලයක් භාවිතා කළ හැකිය. ඔබ එකම පෙළේ සාමාජිකත්වය නැවත නැවත පරීක්ෂා කරන්නේ නම් මෙම ආරම්භක ආයෝජනය ඉක්මනින් ගෙවිය හැකිය. Set
C හි ක්රියාත්මක නොවන නමුත් සරල රූබි පන්තියක් ලෙස තවමත් යටින් පවතින O (1) ප්රවේශ කාලය@hash
මෙය වටී.
සෙට් පන්තිය ක්රියාත්මක කිරීම මෙන්න:
module Enumerable
def to_set(klass = Set, *args, &block)
klass.new(self, *args, &block)
end
end
class Set
def initialize(enum = nil, &block) # :yields: o
@hash ||= Hash.new
enum.nil? and return
if block
do_with_enum(enum) { |o| add(block[o]) }
else
merge(enum)
end
end
def merge(enum)
if enum.instance_of?(self.class)
@hash.update(enum.instance_variable_get(:@hash))
else
do_with_enum(enum) { |o| add(o) }
end
self
end
def add(o)
@hash[o] = true
self
end
def include?(o)
@hash.include?(o)
end
alias member? include?
...
end
සෙට් පන්තිය අභ්යන්තර @hash
නිදසුනක් නිර්මාණය කරන බව ඔබට පෙනෙන පරිදි , සියලු වස්තූන් සිතියම් ගත කර පසුව හැෂ් පන්තියේ O (1) ප්රවේශ වේලාව සමඟ ක්රියාත්මක වන true
සාමාජිකත්වය පරීක්ෂා Hash#include?
කරයි.
අනෙක් ක්රම 7 ම කාර්යක්ෂම නොවන බැවින් මම සාකච්ඡා නොකරමි.
ඉහත ලැයිස්තුගත කර ඇති 11 න් ඔබ්බට O (n) සංකීර්ණතාවයෙන් තවත් බොහෝ ක්රම තිබේ, නමුත් පළමු තරඟයේ දී බිඳවැටීමට වඩා සමස්ත අරා පරිලෝකනය කරන බැවින් ඒවා ලැයිස්තුගත නොකිරීමට මම තීරණය කළෙමි.
මේවා භාවිතා නොකරන්න:
# bad examples
array.grep(element).any?
array.select { |each| each == element }.size > 0
...
11
ඔබ ගණන් බලා ඇති ක්රම ප්රශ්න කිරීමට මට ඉඩ දෙන්න . පළමුව, ඔබ කිසිසේත් ගණන් කළ index
හා find_index
(හෝ find
සහ detect
වෙනම ක්රම ලෙස, ඒ හා සමගාමීව ඔවුන් විසින් ක්රමය සඳහා පමණක් විවිධ නම් වේ වැනි) ඒ අතර වේ. දෙවනුව, අවසන් වන සියලුම ප්රකාශන > 0
වැරදියි, එය අධීක්ෂණයක් බව මට විශ්වාසයි. (cont.)
arr.index(e)
, උදාහරණයක් ලෙස, නැවත 0
නම් arr[0] == e
. ඔබට මතක ඇත arr.index(e)
ප්රතිලාභ nil
නම් e
වර්තමාන නොවේ. index
එක් සොයමින් නම්, කෙසේ වෙතත්, භාවිතා කළ නොහැකි nil
දී arr
. ( rindex
ලැයිස්තුගත කර නොමැති එකම ගැටළුව .). අරාව කට්ටලයක් බවට පරිවර්තනය කර කට්ටල ක්රම භාවිතා කිරීම ටිකක් දිගු කිරීමකි. එසේනම් (අරා සිට යතුරු සහ අත්තනෝමතික අගයන් සහිත) හැෂ් බවට පරිවර්තනය නොවන්නේ නම්, පසුව හැෂ් ක්රම භාවිතා කරන්න. කට්ටලයක් බවට පරිවර්තනය කිරීම හරි වුවත්, භාවිතා කළ හැකි වෙනත් කට්ටල ක්රම තිබේ !arr.to_set.add?(e)
. (
arr.count(e) > 0
, arr != arr.dup.delete(e)
, arr != arr - [e]
සහ arr & [e] == [e]
. කෙනෙකුට රැකියාවක් කළ හැකි select
අතර reject
.
පිළිතුරු කිහිපයක් යෝජනා කරයි Array#include?
, නමුත් එක් වැදගත් අවවාදයක් ඇත: ප්රභවය දෙස බැලීමේදී පවා Array#include?
ලූප කිරීම සිදු කරයි:
rb_ary_includes(VALUE ary, VALUE item)
{
long i;
for (i=0; i<RARRAY_LEN(ary); i++) {
if (rb_equal(RARRAY_AREF(ary, i), item)) {
return Qtrue;
}
}
return Qfalse;
}
වචනය පැවතීමකින් තොරව පරික්ෂා කිරීම සඳහා ක්රමය වන්නේ ඔබේ අරාව සඳහා ත්රිත්වයක් සෑදීමයි . ට්රයි ක්රියාත්මක කිරීම් බොහොමයක් තිබේ (ගූගල් "රූබි ට්රයි"). මම rambling-trie
මෙම උදාහරණයේ භාවිතා කරමි :
a = %w/cat dog bird/
require 'rambling-trie' # if necessary, gem install rambling-trie
trie = Rambling::Trie.create { |trie| a.each do |e| trie << e end }
දැන් අපි ඔබේ අරාවෙහි විවිධ වචන ඇති බව පරීක්ෂා කර බැලීමට සූදානම්ව සිටිමු. O(log n)
කාලයාගේ ඇවෑමෙන්, උප Array#include?
රේඛීය භාවිතා කරමින් සින්ටැක්ටික් සරල බව සමඟ Trie#include?
:
trie.include? 'bird' #=> true
trie.include? 'duck' #=> false
a.each do ... end
ම්ම් ... එය ලූපයක් නොවන්නේ කෙසේදැයි විශ්වාස නැත
Set#include?
කාර්යක්ෂමතාව ගැන සැලකිලිමත් වන පුද්ගලයින් සඳහා දැනටමත් සඳහන් කර ඇති පිළිතුරකට වඩා සටහන් කරන්න ; නූල් වෙනුවට සංකේත භාවිතා කිරීම සමඟ එය O (1) සාමාන්ය අවස්ථාව විය හැකිය (ඔබ නූල් භාවිතා කරන්නේ නම්, හැෂ් ගණනය කිරීම O (n) වන අතර n යනු නූල් වල දිග වේ). නැතහොත් ඔබට තෙවන පාර්ශවීය පුස්තකාල භාවිතා කිරීමට අවශ්ය නම්, ඔබට O (1) නරකම අවස්ථාව වන පරිපූර්ණ හැෂ් භාවිතා කළ හැකිය.
Set
එහි සාමාජිකයින් සුචිගත කිරීම සඳහා හැෂ් භාවිතා කරයි, එබැවින් ඇත්ත වශයෙන්ම හොඳින් බෙදා හරින ලද (වඩාත් නිශ්චිතවම O (ආදාන ප්රමාණය) හැෂිං සඳහා O (1) සහ O (ලොග් (n / බාල්දි අංකය)) සඳහා සංකීර්ණ Set#include?
විය යුතුය. Set
සෙවීම)
ඔබට ලූප කිරීමට අවශ්ය නැතිනම්, අරා සමඟ එය කිරීමට ක්රමයක් නොමැත. ඒ වෙනුවට ඔබ සෙට් එකක් භාවිතා කළ යුතුය.
require 'set'
s = Set.new
100.times{|i| s << "foo#{i}"}
s.include?("foo99")
=> true
[1,2,3,4,5,6,7,8].to_set.include?(4)
=> true
කට්ටල හෑෂ් මෙන් අභ්යන්තරව ක්රියා කරයි, එබැවින් අයිතම සොයා ගැනීම සඳහා රූබිට එකතුව හරහා ලූපයක් අවශ්ය නොවේ, මන්ද නමට අනුව, එය යතුරු වල හැෂ් ජනනය කර මතක සිතියමක් නිර්මාණය කරයි, එවිට සෑම හැෂ් එකක්ම මතකයේ එක්තරා ස්ථානයකට යොමු කරයි. පෙර උදාහරණය හැෂ් සමඟ කළ:
fake_array = {}
100.times{|i| fake_array["foo#{i}"] = 1}
fake_array.has_key?("foo99")
=> true
අවාසිය නම්, සෙට්ස් සහ හැෂ් යතුරු වලට ඇතුළත් කළ හැක්කේ අද්විතීය අයිතම පමණක් වන අතර ඔබ බොහෝ අයිතම එකතු කළහොත්, විශාල යතුරු අවකාශයකට ගැලපෙන නව සිතියමක් තැනීම සඳහා නිශ්චිත අයිතම ගණනකට පසුව රූබිට සියල්ල නැවත සකස් කිරීමට සිදුවනු ඇත. මේ පිළිබඳ වැඩි විස්තර සඳහා, නේතන් ලෝන්ග් විසින් රචිත " මවුන්ටන් වෙස්ට් රූබිකොන්ෆ් 2014 - බිග් ඕ" .
මෙන්න මිණුම් ලකුණක්:
require 'benchmark'
require 'set'
array = []
set = Set.new
10_000.times do |i|
array << "foo#{i}"
set << "foo#{i}"
end
Benchmark.bm do |x|
x.report("array") { 10_000.times { array.include?("foo9999") } }
x.report("set ") { 10_000.times { set.include?("foo9999") } }
end
සහ ප්රති results ල:
user system total real
array 7.020000 0.000000 7.020000 ( 7.031525)
set 0.010000 0.000000 0.010000 ( 0.004816)
include?
මුලින් පහර දෙන්නේ නැද්ද?
include?
පළමු පහරින් නතර වන නමුත් එම පහර ලැයිස්තුවේ අවසානයේ තිබේ නම් .... ගබඩා කිරීම සඳහා අරාව මත රඳා පවතින ඕනෑම විසඳුමක් ලැයිස්තුව වර්ධනය වන විට පිරිහෙන කාර්ය සාධනයක් ඇති කරයි, විශේෂයෙන් අවසානයේ දී මූලද්රව්යයක් සොයා ගැනීමට සිදු වූ විට ලැයිස්තුව. හැෂ් සහ සෙට් වලට එම ගැටලුවක් නොමැත, ඇණවුම් කළ ලැයිස්තුවක් සහ ද්විමය සෙවුමක් ද නැත.
මෙය කිරීමට තවත් ක්රමයක්: Array#index
ක්රමය භාවිතා කරන්න .
එය අරාවෙහි මූලද්රව්යයේ පළමු සිදුවීමේ දර්ශකය ලබා දෙයි.
උදාහරණයක් වශයෙන්:
a = ['cat','dog','horse']
if a.index('dog')
puts "dog exists in the array"
end
index()
අවහිරයක් ද ගත හැකිය:
උදාහරණයක් වශයෙන්:
a = ['cat','dog','horse']
puts a.index {|x| x.match /o/}
මෙය අරාවෙහි පළමු වචනයේ දර්ශකය 'o' අක්ෂරය අඩංගු වේ.
index
තවමත් අරාව හරහා නැවත ක්රියා කරයි, එය මූලද්රව්යයේ අගය ලබා දෙයි.
විනෝදජනක කාරණය,
ප්රකාශනයකින් *
අරාව සාමාජිකත්වය පරීක්ෂා කිරීමට ඔබට භාවිතා කළ හැකිය case
.
case element
when *array
...
else
...
end
පොඩි එක බලන්න *
වගන්තියේ , මෙය අරාවෙහි සාමාජිකත්වය පරීක්ෂා කරයි.
ස්ප්ලැට් ක්රියාකරුගේ සුපුරුදු මැජික් හැසිරීම අදාළ වේ, එබැවින් උදාහරණයක් ලෙස array
ඇත්ත වශයෙන්ම අරාවක් නොව තනි මූලද්රව්යයක් නම් එය එම මූලද්රව්යයට ගැලපේ.
when
හැකි ඉක්මණින් භාවිතා කරමි , එබැවින් වෙනත් වේගවත් චෙක්පත් ඉක්මනින් ඉවත් කර ගන්න.
මෙය ඉටු කර ගැනීම සඳහා විවිධ ක්රම තිබේ. ඒවායින් කිහිපයක් පහත පරිදි වේ:
a = [1,2,3,4,5]
2.in? a #=> true
8.in? a #=> false
a.member? 1 #=> true
a.member? 8 #=> false
Object#in?
රේල් පීලි (එනම් ActiveSupport
) v3.1 + ට පමණක් එකතු කළ බව සලකන්න . එය මූලික රූබි වලින් ලබාගත නොහැක.
මෙය ඔබට පවතින බව පමණක් නොව එය කී වතාවක් දිස්වනවාද යන්න ඔබට කියනු ඇත:
a = ['Cat', 'Dog', 'Bird']
a.count("Dog")
#=> 1
.any?
පළමු ගැලපෙන මූලද්රව්යය සොයාගත් විගසම නැවත පැමිණෙනු .count
ඇත, සෑම විටම මුළු අරාවම ක්රියාවට නංවනු ඇත.
ඔබට ඕනෑම යතුරක් සඳහා ගුණක වාර ගණනක් පරීක්ෂා කිරීමට අවශ්ය නම්, පරිවර්තනය arr
කර hash
දැන් O (1) හි පරීක්ෂා කරන්න
arr = ['Cat', 'Dog', 'Bird']
hash = arr.map {|x| [x,true]}.to_h
=> {"Cat"=>true, "Dog"=>true, "Bird"=>true}
hash["Dog"]
=> true
hash["Insect"]
=> false
හැෂ් # has_key හි කාර්ය සාධනය ? එදිරිවඅරාව # ?
පරාමිති හැෂ් # has_key? අරාව # ඇතුළත් කරන්න කාල සංකීර්ණතාව O (1) මෙහෙයුම O (n) මෙහෙයුම ප්රවේශ වර්ගය ප්රවේශය හැෂ් [යතුර] එය එක් එක් මූලද්රව්යය හරහා වෙනස් වේ නම් අරාවෙහි ඕනෑම අගයක් නැවත ලබා දෙයි සත්යය අරාවෙහි ඇති සොයාගැනීම් වෙත ආපසු යවනු ලැබේ හැෂ් # has_key? අමතන්න අමතන්න
තනි කාල පරික්ෂා කිරීම සඳහා භාවිතා include?
කිරීම හොඳයි
එය වටින දේ සඳහා, රූබි ලියකියවිලි මේ ආකාරයේ ප්රශ්න සඳහා පුදුමාකාර සම්පතකි.
ඔබ සොයන අරාවෙහි දිග ගැනද මම සටහන් කරමි. මෙම include?
ක්රමය මඟින් O (n) සංකීර්ණතාවයෙන් රේඛීය සෙවුමක් ක්රියාත්මක කරනු ඇති අතර එය අරාවෙහි ප්රමාණය අනුව තරමක් කැත විය හැකිය.
ඔබ විශාල (වර්ග කළ) අරාවක් සමඟ වැඩ කරන්නේ නම්, ද්විමය සෙවුම් ඇල්ගොරිතමයක් ලිවීම ගැන මම සලකා බලමි . එය එතරම් අපහසු නොවිය යුතු අතර O (log n) හි නරකම අවස්ථාවකි.
නැතහොත් ඔබ රූබි 2.0 භාවිතා කරන්නේ නම්, ඔබට එයින් ප්රයෝජන ගත හැකිය bsearch
.
<=>
, එය සැමවිටම එසේ නොවේ. උදාහරණයක් ලෙස, අරාවේ මූලද්රව්ය හැෂ් යැයි සිතමු.
ඔබට උත්සාහ කළ හැකිය:
උදාහරණය: බළලා සහ බල්ලා අරාවෙහි පවතී නම්:
(['Cat','Dog','Bird'] & ['Cat','Dog'] ).size == 2 #or replace 2 with ['Cat','Dog].size
වෙනුවට:
['Cat','Dog','Bird'].member?('Cat') and ['Cat','Dog','Bird'].include?('Dog')
සටහන: member?
සහ include?
සමාන වේ.
මෙය එක් පේළියකින් වැඩ කළ හැකිය!
අපට භාවිතා නොකිරීමට අවශ්ය නම් include?
මෙයද ක්රියාත්මක වේ:
['cat','dog','horse'].select{ |x| x == 'dog' }.any?
['Cat', 'Dog', 'Bird'].detect { |x| x == 'Dog'}
=> "Dog"
!['Cat', 'Dog', 'Bird'].detect { |x| x == 'Dog'}.nil?
=> true
['Cat', nil, 'Dog'].detect { |x| x == nil } #=> nil
. nil
හමු වුනාද ?
ඔබ මෙය මිනි ටෙස්ට් ඒකක පරීක්ෂණයකදී කිරීමට උත්සාහ කරන්නේ නම් , ඔබට භාවිතා කළ හැකිය assert_includes
. උදාහරණයක්:
pets = ['Cat', 'Dog', 'Bird']
assert_includes(pets, 'Dog') # -> passes
assert_includes(pets, 'Zebra') # -> fails
මේ වටා වෙනත් ක්රමයක් තිබේ.
අරාව [ :edit, :update, :create, :show ]
, සමහරවිට මුළු මාරාන්තික / විවේකී පව් යැයි සිතමු .
යම් නූලකින් වලංගු ක්රියාවක් ඇද ගැනීමේ අදහස ඇති තවත් සෙල්ලම් බඩු :
"my brother would like me to update his profile"
ඉන්පසු:
[ :edit, :update, :create, :show ].select{|v| v if "my brother would like me to update his profile".downcase =~ /[,|.| |]#{v.to_s}[,|.| |]/}
/[,|.| |]#{v.to_s}[,|.| |]/
මා සිතන්නේ ඔබට 'එකකින් වට වූ ක්රියාවෙහි නම: කොමාව, කාල පරිච්ඡේදය, අවකාශය හෝ කිසිවක් නැත' යන්න සොයා ගැනීමට අවශ්ය බවය, නමුත් සියුම් දෝෂ කිහිපයක් තිබේ. "|update|"
ඇති බවත් නැවත [:update]
සහ "update"
නැවත ශ්රී []
. අක්ෂර පංති ( [...]
) |
අක්ෂර වෙන් කිරීම සඳහා පයිප්ප ( ) භාවිතා නොකරන්න . අපි ඒවා කණ්ඩායම් ( (...)
) ලෙස වෙනස් කළත් ඔබට හිස් අක්ෂරයකට අනුරූප විය නොහැක. එබැවින් ඔබට බොහෝ විට අවශ්ය වී ඇත්තේ/(,|\.| |^)#{v.to_s}(,|\.| |$)/
/[,. ]/
ඔබට සත්යය හෝ අසත්යය පමණක් නොව වටිනාකම ආපසු ලබා දීමට අවශ්ය නම් භාවිතා කරන්න
array.find{|x| x == 'Dog'}
ලැයිස්තුවේ තිබේ නම් මෙය 'බල්ලා' යවනු ඇත, එසේ නොවේ.
array.any?{|x| x == 'Dog'}
ඔබට සත්ය / අසත්යය (වටිනාකම නොව) අවශ්ය නම් භාවිතා කරන්න , නමුත් මේ වගේ කොටසකට සංසන්දනය කිරීමට අවශ්යය.
ඔබට භාවිතා කිරීමට අවශ්ය include?
නැතිනම් ඔබට මුලින් මූලද්රව්යය අරාවකින් ඔතා ඉන්පසු ඔතා ඇති මූලද්රව්යය අරාවේ ඡේදනය හා ඔතා ඇති මූලද්රව්යයට සමාන දැයි පරීක්ෂා කළ හැකිය. මෙය සමානාත්මතාවය මත පදනම් වූ බූලියන් අගයක් ලබා දෙනු ඇත.
def in_array?(array, item)
item = [item] unless item.is_a?(Array)
item == array & item
end
මෙය කිරීමට තවත් එක් ක්රමයක් මෙන්න:
arr = ['Cat', 'Dog', 'Bird']
e = 'Dog'
present = arr.size != (arr - [e]).size
arr != arr - [e]
. arr & [e] == [e]
එකම රේඛා ඔස්සේ තවත් ක්රමයක්.
ඕනෑම අරාවකට මූලද්රව්යයක් සොයා ගැනීමට එයට බොහෝ ක්රම ඇති නමුත් සරලම ක්රමය වන්නේ 'in?' ක්රමය.
example:
arr = [1,2,3,4]
number = 1
puts "yes #{number} is present in arr" if number.in? arr
in?
අවශ්ය වේ ActiveSupport
: require active_support
.
array = [ 'Cat', 'Dog', 'Bird' ]
array.include?("Dog")
යමක් කිරීමේ විවිධ ක්රමවල සාපේක්ෂ වේගය බැලීමට සමහර මිණුම් සලකුණු ධාවනය කිරීම මට සෑම විටම සිත්ගන්නා සුළුය.
ආරම්භයේ, මැද හෝ අවසානයේ අරාව මූලද්රව්යයක් සොයා ගැනීම ඕනෑම රේඛීය සෙවුමකට බලපාන නමුත් කට්ටලයකට එරෙහි සෙවුමකට යන්තම් බලපායි.
අරාව කට්ටලයක් බවට පරිවර්තනය කිරීම සැකසීමේ වේලාවට විශාල බලපෑමක් ඇති කරයි, එබැවින් එක් වරක් අරාවකින් කට්ටලය සාදන්න, නැතහොත් මුල සිටම කට්ටලයක් සමඟ ආරම්භ කරන්න.
මෙන්න මිණුම් දණ්ඩ කේතය:
# frozen_string_literal: true
require 'fruity'
require 'set'
ARRAY = (1..20_000).to_a
SET = ARRAY.to_set
DIVIDER = '-' * 20
def array_include?(elem)
ARRAY.include?(elem)
end
def array_member?(elem)
ARRAY.member?(elem)
end
def array_index(elem)
ARRAY.index(elem) >= 0
end
def array_find_index(elem)
ARRAY.find_index(elem) >= 0
end
def array_index_each(elem)
ARRAY.index { |each| each == elem } >= 0
end
def array_find_index_each(elem)
ARRAY.find_index { |each| each == elem } >= 0
end
def array_any_each(elem)
ARRAY.any? { |each| each == elem }
end
def array_find_each(elem)
ARRAY.find { |each| each == elem } != nil
end
def array_detect_each(elem)
ARRAY.detect { |each| each == elem } != nil
end
def set_include?(elem)
SET.include?(elem)
end
def set_member?(elem)
SET.member?(elem)
end
puts format('Ruby v.%s', RUBY_VERSION)
{
'First' => ARRAY.first,
'Middle' => (ARRAY.size / 2).to_i,
'Last' => ARRAY.last
}.each do |k, element|
puts DIVIDER, k, DIVIDER
compare do
_array_include? { array_include?(element) }
_array_member? { array_member?(element) }
_array_index { array_index(element) }
_array_find_index { array_find_index(element) }
_array_index_each { array_index_each(element) }
_array_find_index_each { array_find_index_each(element) }
_array_any_each { array_any_each(element) }
_array_find_each { array_find_each(element) }
_array_detect_each { array_detect_each(element) }
end
end
puts '', DIVIDER, 'Sets vs. Array.include?', DIVIDER
{
'First' => ARRAY.first,
'Middle' => (ARRAY.size / 2).to_i,
'Last' => ARRAY.last
}.each do |k, element|
puts DIVIDER, k, DIVIDER
compare do
_array_include? { array_include?(element) }
_set_include? { set_include?(element) }
_set_member? { set_member?(element) }
end
end
මගේ මැක් ඕඑස් ලැප්ටොප් පරිගණකයේ ධාවනය වන විට එහි ප්රති results ලය වනුයේ:
Ruby v.2.7.0
--------------------
First
--------------------
Running each test 65536 times. Test will take about 5 seconds.
_array_include? is similar to _array_index
_array_index is similar to _array_find_index
_array_find_index is faster than _array_any_each by 2x ± 1.0
_array_any_each is similar to _array_index_each
_array_index_each is similar to _array_find_index_each
_array_find_index_each is faster than _array_member? by 4x ± 1.0
_array_member? is faster than _array_detect_each by 2x ± 1.0
_array_detect_each is similar to _array_find_each
--------------------
Middle
--------------------
Running each test 32 times. Test will take about 2 seconds.
_array_include? is similar to _array_find_index
_array_find_index is similar to _array_index
_array_index is faster than _array_member? by 2x ± 0.1
_array_member? is faster than _array_index_each by 2x ± 0.1
_array_index_each is similar to _array_find_index_each
_array_find_index_each is similar to _array_any_each
_array_any_each is faster than _array_detect_each by 30.000000000000004% ± 10.0%
_array_detect_each is similar to _array_find_each
--------------------
Last
--------------------
Running each test 16 times. Test will take about 2 seconds.
_array_include? is faster than _array_find_index by 10.000000000000009% ± 10.0%
_array_find_index is similar to _array_index
_array_index is faster than _array_member? by 3x ± 0.1
_array_member? is faster than _array_find_index_each by 2x ± 0.1
_array_find_index_each is similar to _array_index_each
_array_index_each is similar to _array_any_each
_array_any_each is faster than _array_detect_each by 30.000000000000004% ± 10.0%
_array_detect_each is similar to _array_find_each
--------------------
Sets vs. Array.include?
--------------------
--------------------
First
--------------------
Running each test 65536 times. Test will take about 1 second.
_array_include? is similar to _set_include?
_set_include? is similar to _set_member?
--------------------
Middle
--------------------
Running each test 65536 times. Test will take about 2 minutes.
_set_member? is similar to _set_include?
_set_include? is faster than _array_include? by 1400x ± 1000.0
--------------------
Last
--------------------
Running each test 65536 times. Test will take about 4 minutes.
_set_member? is similar to _set_include?
_set_include? is faster than _array_include? by 3000x ± 1000.0
මූලික වශයෙන් ප්රති results ල මට පවසන්නේ සෑම දෙයක්ම සඳහා කට්ටලයක් භාවිතා කරන ලෙසයි. මම ඇතුළත් කිරීම සෙවීමට යන්නේ නම් මිස පළමු අංගය මට අවශ්ය එක බව සහතික කළ නොහැකි නම් එය බොහෝ දුරට ඉඩ නැත. හෑෂ් එකකට මූලද්රව්ය ඇතුල් කිරීමේදී යම්කිසි පොදු කාර්යයක් ඇත, නමුත් සෙවුම් වේලාවන් ඉතා වේගවත් බැවින් එය කිසි විටෙකත් සලකා බැලිය යුතු යැයි මම නොසිතමි. නැවතත්, ඔබට එය සෙවීමට අවශ්ය නම්, අරාව භාවිතා නොකරන්න, කට්ටලයක් භාවිතා කරන්න. (හෝ හැෂ්.)
අරාව කුඩා වන තරමට අරා ක්රම ක්රියාත්මක වනු ඇත, නමුත් ඒවා තවමත් පවත්වා ගෙන යන්නේ නැත, කුඩා අරා වල වෙනස ඉතා කුඩා විය හැක.
"මුලින්ම", "මැද" සහ "පසුගිය" භාවිතය පිළිබිඹු first
, size / 2
සහ last
සඳහා ARRAY
පැවැත්ම සඳහා සොයා එම මූලද්රව්යය සඳහා. ARRAY
සහ SET
විචල්යයන් සෙවීමේදී එම මූලද්රව්යය භාවිතා වේ.
සංසන්දනය කරන ක්රම සඳහා සුළු වෙනස්කම් සිදු කරන > 0
ලද්දේ පරීක්ෂණය වර්ග පරීක්ෂණ >= 0
සඳහා විය යුතු බැවිනි index
.
පලතුරු සහ එහි ක්රමවේදය පිළිබඳ වැඩි විස්තර එහි README හි ඇත.