রুনি কী?


186

একটি কি runeযান কি?

আমি গুগলিং করছি তবে গোলং কেবল এক লাইনে বলেছেন: এটির runeজন্য একটি নামint32

তবে কীভাবে চার্জগুলি অদলবদলের মতো ব্যবহার করা যায়?

নীচে একটি ফাংশন স্বাপকেস রয়েছে। সব কি <=এবং -?

এবং কেন switchকোনও যুক্তি নেই?

&&মানে হওয়া উচিত এবং তবে কি r <= 'z'?

func SwapRune(r rune) rune {
    switch {
    case 'a' <= r && r <= 'z':
        return r - 'a' + 'A'
    case 'A' <= r && r <= 'Z':
        return r - 'A' + 'a'
    default:
        return r
    }
}

তাদের বেশিরভাগ হলেন http://play.golang.org/p/H6wjLZj6lW থেকে

func SwapCase(str string) string {
    return strings.Map(SwapRune, str)
}

আমি বুঝতে পারি এটি ম্যাপিং runeকরছে stringযাতে এটি অদলবদল স্ট্রিংটি ফিরে আসতে পারে। তবে ঠিক কীভাবে runeবা byteএখানে কাজ করে তা আমি বুঝতে পারি না ।


সিডিনোট: এটি ইংরেজী শব্দ "ক্যাফে" এবং অন্যদের জন্য তরুণ পাঠকরা যা করতে চায় তা করে না - অন্য ভাষা ছেড়ে দিন। এই ধরণের রূপান্তরটির প্রকৃত উপকারী রূপগুলির জন্য শালীন সমর্থন সহ লাইব্রেরি রয়েছে।
রেডগ্রিটিব্রিক

2
"রুনি" শব্দটি কোথা থেকে এসেছে তা যদি কেউ জানতে চায়: এন.ইউইউইকিপিডিয়া.আরউইকি
ম্যাট ব্রাউন

উত্তর:


146

রুন আক্ষরিকাগুলি কেবল 32-বিট পূর্ণ সংখ্যার মান ( তবে তারা টাইপযুক্ত ধ্রুবক, তাই তাদের ধরণটি পরিবর্তন করতে পারে )। তারা ইউনিকোড কোডপয়েন্টগুলি উপস্থাপন করে। উদাহরণস্বরূপ, রুনে আক্ষরিক 'a'আসলে সংখ্যাটি 97

সুতরাং আপনার প্রোগ্রামটি বেশ সমান:

package main

import "fmt"

func SwapRune(r rune) rune {
    switch {
    case 97 <= r && r <= 122:
        return r - 32
    case 65 <= r && r <= 90:
        return r + 32
    default:
        return r
    }
}

func main() {
    fmt.Println(SwapRune('a'))
}

এটি আপনার কাছে স্পষ্ট হওয়া উচিত, আপনি যদি ইউনিকোড ম্যাপিংটি লক্ষ্য করেন তবে এটি সেই পরিসরের ASCII এর মতো। তদ্ব্যতীত, 32 আসলে বড় হাতের এবং চরিত্রের ছোট কোডপয়েন্টের মধ্যে অফসেট। সুতরাং যোগ 32করে 'A', আপনি পেতে 'a'এবং বিপরীত।


12
এটি কেবল ASCII অক্ষরের জন্য কাজ করে এবং 'ä' এর মতো অ্যাকসেন্ট অক্ষরগুলির জন্য নয়, 'ı' (ইউ + 0131) এর মতো আরও জটিল কেসগুলিকে ছেড়ে দেওয়া যাক alone ছোট ক্ষেত্রে যেমন মানচিত্রে যান তেমন বিশেষ কার্যাদি রয়েছে unicode.ToLower(r rune) rune
টপস্কিপ

2
এবং @ টপস্কিপের সঠিক উত্তরটি যুক্ত করতে একটি সোয়াপকেস ফাংশন যা কেবলমাত্র এজেই নয় সমস্ত কোডপয়েন্টের জন্য কাজ করে:func SwapRune(r rune) rune { if unicode.IsUpper(r) { r = unicode.ToLower(r) } else { r = unicode.ToUpper(r) }; return r }
এনিসাস

22
রুনস হল মান 32 মান। এটাই পুরো উত্তর। তারা "ম্যাপ করা" নয়
thwd

@ অ্যালেক্সএ্যাক্সেল: সিম্পিকফোল্ডের আচরণ মূলত একই রকম (এটি বেশিরভাগ রানসের জন্য টোলওয়ার এবং টুঅপার ব্যবহার করে)। কিছু ক্ষেত্রে রয়েছে যেখানে এটি পৃথক হয় যেমন: DZ-> Dz, Dz-> dz, dz-> DZ DZ এর পরিবর্তে আমার অদলবদল যেতে হবে: DZ-> dz, Dz-> DZ, dz-> DZ DZ আমি আপনার পরামর্শটি আরও পছন্দ করি :)
আনিসাস

3
সুতরাং রানস কি সি বর্ণের সাথে সমান?
কেনি ওয়ার্ডেন

52

গো ল্যাং রিলিজ নোটগুলি থেকে: http://golang.org/doc/go1#rune

রুন একটি প্রকার। এটি 32 বিট দখল করে এবং এটি কোনও ইউনিকোড কোডপয়েন্ট উপস্থাপন করে । সাদৃশ্য হিসাবে 'ASCII' এ এনকোডযুক্ত ইংরেজি বর্ণগুলির 128 কোড পয়েন্ট রয়েছে। এইভাবে একটি বাইট (8 বিট) এর ভিতরে ফিট করতে সক্ষম। এর (ভ্রান্ত) অনুমান থেকে সি অক্ষরগুলিকে 'বাইটস' char, এবং 'স্ট্রিংস' কে 'অক্ষরের ক্রম' হিসাবে ধরেছিল char*

কিন্তু অনুমান করতে পার কি. 'অ্যাবসিডি ..' চিহ্ন ছাড়াও অন্য অনেকগুলি প্রতীক মানব উদ্ভাবিত রয়েছে। এবং এমন অনেকগুলি রয়েছে যা তাদের এনকোড করার জন্য আমাদের 32 বিটের প্রয়োজন need

গোলাংয়ে তখন stringএকটি এর ক্রম bytes। তবে, যেহেতু একাধিক বাইটগুলি একটি রুন কোড-পয়েন্ট উপস্থাপন করতে পারে, একটি স্ট্রিংয়ের মানটিতেও রানস থাকতে পারে। সুতরাং, এটি একটি []rune, বা বিপরীতে রূপান্তর করা যেতে পারে ।

ইউনিকোড প্যাকেজ http://golang.org/pkg/unicode/ চ্যালেঞ্জের richশ্বর্যের স্বাদ দিতে পারে।


6
সাম্প্রতিক ইউনিকোড 6.3 এর সাথে, 110,000 এরও বেশি প্রতীক সংজ্ঞায়িত হয়েছে। এর জন্য প্রতিটি কোড পয়েন্টের কমপক্ষে 21-বিট উপস্থাপনা প্রয়োজন, সুতরাং এটির runeমতো int32এবং প্রচুর পরিমাণে বিট থাকে।
রিক -777

2
আপনি "একটি এস এর stringঅনুক্রম " বলছেন rune- আমি কি সত্য বলে মনে করি না? গো ব্লগ : "একটি স্ট্রিং কেবলমাত্র বাইটের গুচ্ছ"; গো ল্যাং স্পেক : "একটি স্ট্রিং মান বাইটের একটি (সম্ভবত খালি) অনুক্রম"
ক্রিস মার্টিন

1
আমি এখনও বিভ্রান্ত, তাই রুনসের একটি অ্যারে বা বাইটের একটি অ্যারে স্ট্রিং হয়? তারা কি বিনিময়যোগ্য?
gogofan

1
@prvn এটি ভুল এটি বলার মতো যে কোনও চিত্র বাইটের ক্রম নয়, এটি পিক্সেলের ক্রম। কিন্তু, আসলে, নীচে, এটি বাইটের একটি সিরিজ। একটি স্ট্রিং রান্স নয়, বাইটের একটি সিরিজ। অনুগ্রহ করে পড়ুন বৈশিষ্ট
Inanc Gumus

1
@prvn তবে আপনি বলতে পারবেন না not bytes। তারপরে, আপনি বলতে পারেন: "স্ট্রিংগুলি রানস এবং রুনগুলি বাইট দ্বারা তৈরি হয়" এরকম কিছু। তারপর আবার। এটা সম্পূর্ণ সত্য নয়।
Inanc Gumus

28

আমি আমার ভাষাটি সহজ রাখার চেষ্টা করেছি যাতে কোনও সাধারণ মানুষ বুঝতে পারে rune

রুন একটি চরিত্র। এটাই.

এটি একটি একক চরিত্র। এটি বিশ্বের যে কোনও ভাষা থেকে যে কোনও বর্ণমালার একটি চরিত্র।

একটি স্ট্রিং পেতে আমরা ব্যবহার করি

double-quotes ""

অথবা

back-ticks ``

একটি স্ট্রিং একটি রুনের চেয়ে আলাদা। রানগুলিতে আমরা ব্যবহার করি

single-quotes ''

এখন রুনাও একটি উপনাম int32... আহ কি?

রুনে এর একটি নাম কারণ int32হ'ল কারণ আমরা দেখি যে নীচের মতো কোডিং স্কিম রয়েছে এখানে চিত্র বর্ণনা লিখুন

প্রতিটি চরিত্র কিছু সংখ্যায় মানচিত্র করে এবং তাই এটি আমরা সংরক্ষণ করি। উদাহরণস্বরূপ, একটি মানচিত্র 97 এবং যখন আমরা যে সংখ্যা সংরক্ষণ এটা শুধু সংখ্যা এবং তাই উপায় জাদুঅক্ষর int32 জন্য একটি alias হয়। তবে কেবল কোনও সংখ্যা নয়। এটি 32 'শূন্য এবং বেশী' বা '4' বাইট সহ একটি সংখ্যা। (দ্রষ্টব্য: ইউটিএফ -8 একটি 4 বাইট এনকোডিং স্কিম)

রুনগুলি স্ট্রিংয়ের সাথে কীভাবে সম্পর্কিত?

একটি স্ট্রিং রানসের সংকলন। নিম্নলিখিত কোডে:

    package main

    import (
        "fmt"
    )

    func main() {
        fmt.Println([]byte("Hello"))
    }

আমরা স্ট্রিংকে বাইটের স্ট্রিমে রূপান্তরিত করার চেষ্টা করি। আউটপুটটি হ'ল:

[72 101 108 108 111]

আমরা দেখতে পাচ্ছি যে স্ট্রিংটি তৈরি করা প্রতিটি বাইট একটি রুন।


2
A string is not a collection of runesএটি কঠোরভাবে বলা ঠিক নয়। পরিবর্তে, স্ট্রিংটি একটি বাইট স্লাইস, utf8 সহ এনকোড। স্ট্রিংয়ের প্রতিটি চর আসলে 1 ~ 3 বাইট নেয়, যখন প্রতিটি রুন 4 বাইট নেয়। আপনি স্ট্রিং এবং [] রুনের মধ্যে রূপান্তর করতে পারেন তবে এগুলি আলাদা।
এরিক ওয়াং

2
রুন কোনও চরিত্র নয়, একটি রুন একটি ইউনিকোড কোডপয়েন্টকে উপস্থাপন করে। এবং একটি কোডপয়েন্ট অগত্যা একটি চরিত্রের দিকে নির্দেশ করে না।
Inanc Gumus

ওয়ার্থ যোগ করার জন্য যে হ্যাঁ "একটি জাদুঅক্ষর এছাড়াও int32 জন্য একটি alias হয়", কিন্তু এটা মানে এই নয় এটা দরিদ্র ম্যান কম্প্রেশন জন্য উপযোগী ... আপনি 55296 ভালো কিছু স্ট্রিং রূপান্তর বিপথে যায় আঘাত এমন: যান খেলার মাঠ
kubanczyk

27

ফ্যাব্রিজিওএম এর উত্তরে মন্তব্য পোস্ট করার মতো যথেষ্ট খ্যাতি আমার নেই, সুতরাং পরিবর্তে আমাকে এটি এখানে পোস্ট করতে হবে।

ফ্যাবরিজিওর উত্তরটি মূলত সঠিক, এবং তিনি অবশ্যই সমস্যার সারমর্মটি গ্রহণ করেছেন - যদিও এর মধ্যে একটি পার্থক্য থাকা আবশ্যক।

একটি স্ট্রিং অগত্যা রানসের ক্রম নয় । এটি একটি 'বাইটস এর স্লাইস' এর উপরে একটি মোড়ক, একটি টুকরো একটি গো অ্যারের উপরে একটি মোড়ক। এতে কী তফাত হয়?

একটি রুনে টাইপটি অবশ্যই 32-বিট মান, যার অর্থ রুনের ধরণের মানগুলির ক্রমটি কিছু সংখ্যক বিট x * 32 থাকে। স্ট্রিংগুলি, বাইটের ক্রম হিসাবে এর পরিবর্তে দৈর্ঘ্যের x * 8 বিট থাকে। সমস্ত স্ট্রিং আসলে ইউনিকোডে থাকলে এই পার্থক্যের কোনও প্রভাব পড়ত না। যেহেতু স্ট্রিংগুলি বাইটের স্লাইস , যাইহোক, গো ASCII বা অন্য কোনও নির্বিচার বাইট এনকোডিং ব্যবহার করতে পারে।

স্ট্রিং লিটারেলগুলি অবশ্য ইউটিএফ -8 এ এনকোড করা উত্সে লিখতে হবে।

তথ্যের উত্স: http://blog.golang.org/strings


1
ভাল যুক্তি ! প্রতিটি রুনের জন্য 4 বাইট প্রয়োজন, তবে স্ট্রিংয়ের প্রতিটি অক্ষরটি ইউটিএফ 8 দিয়ে এনকোড থাকে, সুতরাং কেবলমাত্র 1 ~ 3 বাইট সর্বাধিক।
এরিক ওয়াং

15

(একটি অনুভূতি পেয়েছি যে উপরের উত্তরগুলি এখনও পার্থক্য এবং সম্পর্কের মধ্যে পার্থক্য stringএবং []runeখুব স্পষ্টভাবে বর্ণনা করে না, তাই আমি উদাহরণ সহ আরও একটি উত্তর যুক্ত করার চেষ্টা করব))

হিসাবে @Strangeworkএর উত্তর বললেন, stringএবং []runeশান্ত ভিন্ন।

পার্থক্য - stringএবং []rune:

  • string valueকেবল পঠনযোগ্য বাইট স্লাইস। এবং, একটি স্ট্রিং আক্ষরিক utf-8 এ এনকোড করা আছে। প্রতিটি গৃহস্থালির কাজ stringআসলে লাগে 1 ~ 3 বাইট, প্রতিটি সময় runeলাগে 4 বাইট
  • জন্য string, উভয় len()এবং সূচক বাইট উপর ভিত্তি করে।
  • কারণ []rune, উভয় len()এবং সূচকগুলি রুনে (বা int32) এর উপর ভিত্তি করে।

সম্পর্ক - stringএবং []rune:

  • যখন আপনার কাছ থেকে রূপান্তর stringকরতে []rune, যে স্ট্রিং প্রতিটি UTF-8 গৃহস্থালির কাজ একটি হয়ে rune
  • একইভাবে, বিপরীত রূপান্তরে, যখন রূপান্তরিত []runeহয় string, প্রত্যেকটি runeএকটিতে utf-8 চর হয়ে যায় string

পরামর্শ:

  • আপনি stringএবং এর মধ্যে রূপান্তর করতে পারেন []runeতবে তবুও এগুলি আলাদা এবং সামগ্রিক আকার উভয়ই।

(আরও স্পষ্টভাবে এটি দেখানোর জন্য আমি একটি উদাহরণ যুক্ত করব))


কোড

string_rune_compare.go:

// string & rune compare,
package main

import "fmt"

// string & rune compare,
func stringAndRuneCompare() {
    // string,
    s := "hello你好"

    fmt.Printf("%s, type: %T, len: %d\n", s, s, len(s))
    fmt.Printf("s[%d]: %v, type: %T\n", 0, s[0], s[0])
    li := len(s) - 1 // last index,
    fmt.Printf("s[%d]: %v, type: %T\n\n", li, s[li], s[li])

    // []rune
    rs := []rune(s)
    fmt.Printf("%v, type: %T, len: %d\n", rs, rs, len(rs))
}

func main() {
    stringAndRuneCompare()
}

এক্সিকিউট:

স্ট্রিং_রুন_কম্পের.গো চালান

আউটপুট:

hello你好, type: string, len: 11
s[0]: 104, type: uint8
s[10]: 189, type: uint8

[104 101 108 108 111 20320 22909], type: []int32, len: 7

ব্যাখ্যা:

  • স্ট্রিংটির hello你好দৈর্ঘ্য 11, কারণ প্রথম 5 টি অক্ষর প্রতি 1 জন বাইট নেয়, যখন শেষ 2 টি চীনা অক্ষরে 3 বাইট লাগে।

    • সুতরাং, total bytes = 5 * 1 + 2 * 3 = 11
    • যেহেতু len()স্ট্রিং অন বাইটের উপর ভিত্তি করে, সুতরাং প্রথম লাইনটি মুদ্রিত হয়len: 11
    • যেহেতু স্ট্রিংয়ের সূচকগুলিও বাইটের উপর ভিত্তি করে, সুতরাং নিম্নলিখিত 2 টি লাইনের প্রিন্টের প্রকারের মান uint8(যেহেতু byteএকটি উপসর্গের নাম , চলমান uint8)।
  • যখন রূপান্তর stringকরতে []rune, এটি 7 UTF8 অক্ষর, এইভাবে 7 runes পাওয়া যায় নি।

    • যেহেতু len()অন []runeরুনের উপর ভিত্তি করে, সুতরাং শেষ লাইনটি মুদ্রিত len: 7
    • আপনি যদি []runeসূচকের মাধ্যমে পরিচালনা করেন তবে এটি রুনে ভিত্তিতে অ্যাক্সেস করবে।
      যেহেতু প্রতিটি রুন মূল স্ট্রিংয়ের একটি utf8 চর থেকে, সুতরাং আপনি উভয়ই বলতে পারেন এবং উপরের len()সূচক অপারেশনটি []runeutf8 অক্ষরের উপর ভিত্তি করে।

"স্ট্রিংয়ের জন্য, লেন () এবং সূচি উভয়ই বাইটের উপর ভিত্তি করে।" আপনি কি আরও কিছু ব্যাখ্যা করতে পারেন? আমি যখন fmt.Println("hello你好"[0])এটি করি তখন বাইটের পরিবর্তে প্রকৃত UTF-8 কোড পয়েন্টটি দেয় returns
জুলিয়ান

@ জুলিয়ান দয়া করে উত্তরের প্রোগ্রামটির আউটপুটটি একবার দেখুন, কারণ s[0]এটি প্রিন্ট করে s[0]: 104, type: uint8, টাইপটি এর uint8অর্থ এটি একটি বাইট। ASCII অক্ষরের জন্য hutf-8 এর মতো এটির প্রতিনিধিত্ব করতে একক বাইটও ব্যবহার করে, সুতরাং কোড পয়েন্টটি একক বাইটের সমান; তবে চাইনিজ চরগুলির জন্য এটি 3 বাইট ব্যবহার করে।
এরিক ওয়াং

7

বাকি সবাই রুনস সম্পর্কিত অংশটি কভার করেছে, সুতরাং আমি সে সম্পর্কে কথা বলতে যাচ্ছি না।

তবে, switchকোনও যুক্তি না থাকার বিষয়েও একটি প্রশ্ন রয়েছে is এটি কেবল কারণ গোলাংয়ে, switchকোনও বাক্য ছাড়াই অন্য কোনও যুক্তি প্রকাশ করার বিকল্প উপায়। উদাহরণস্বরূপ, এটি লেখা:

t := time.Now()
switch {
case t.Hour() < 12:
    fmt.Println("It's before noon")
default:
    fmt.Println("It's after noon")
}

এটি লেখার মতোই:

t := time.Now()
if t.Hour() < 12 {
    fmt.Println("It's before noon")
} else {
    fmt.Println("It's after noon")
}

আপনি এখানে আরও পড়তে পারেন ।


0

রুনি একটি অন্তর্নির্মিত মান and এবং তাই এটি একটি গো টাইপ যা ইউনিকোড কোড পয়েন্ট উপস্থাপনের জন্য ব্যবহৃত হয়। একটি ইউনিকোড কোড পয়েন্ট বা কোড পজিশন এমন একটি সংখ্যাসূচক মান যা সাধারণত একক ইউনিকোড অক্ষর উপস্থাপনের জন্য ব্যবহৃত হয়;

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